使用SpringBoot+OkHttp+fastjson實現Github的OAuth第三方登錄
時間:2020-02-02來源:系統城作者:電腦系統城
一、在GitHub上創建一個OAuth





二、OAuth的原理
Spring官方文檔

三、OkHttp的使用
OkHttp官方網站
1.Post

代碼示例
- //官方文檔: public static final MediaType JSON
- // = MediaType.get("application/json; charset=utf-8");
- MediaType mediaType = MediaType.get("application/json; charset=utf-8");//去掉前綴,并且修改MediaType對象名,因為一會使用fastjson變量會重名
- OkHttpClient client = new OkHttpClient();//第二句照抄
- RequestBody body = RequestBody.create(json,mediaType);//直接復制方法體中的內容
- Request request = new Request.Builder()
- .url("")//填寫要發送請求的地址
- .post(body)
- .build();
- try (Response response = client.newCall(request).execute()) {
- return response.body().string();//返回的字符串(json)
- }
2.Get

代碼示例
- OkHttpClient client = new OkHttpClient();//同上
- Request request = new Request.Builder()//直接復制方法體中的內容
- .url(url)//同上
- .build();
-
- try (Response response = client.newCall(request).execute()) {
- return response.body().string();//同上
- }
四、fastJson的使用
- JSON.toJSONString(實體類)//將實體類轉換為JSON字符串
- JSON.parseObject(string, 實體類.class);//將JSON字符串轉換為實體類
五、代碼示例
前端代碼
- <a href="https://github.com/login/oauth/authorize?client_id=xxx&redirect_uri=http://127.0.0.1:8080/xxx&scope=user&state=1" rel="external nofollow" >Login</a>
- //scope和state不寫可能會報錯
- @Controller
- public class AuthorizeController {
-
- @Autowired
- GithubProvider githubProvider;
-
- @GetMapping("/callback")
- public String callback(@RequestParam(name ="code") String code, @RequestParam(name ="state") String state){
- AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
- accessTokenDTO.setClient_id("");
- accessTokenDTO.setClient\_secret("");
- accessTokenDTO.setCode(code);
- accessTokenDTO.setState(state);
- accessTokenDTO.setRedirect\_uri("https://github.com/login/oauth/access_token");
- String token = githubProvider.getAccessToken(accessTokenDTO);
- GithubUser githubUser = githubProvider.getUser(token);
- return "index";
- }
-
- }
- @Component
- public class GithubProvider {
-
- public String getAccessToken(AccessTokenDTO accessTokenDTO){
- MediaType mediaType = MediaType.get("application/json; charset=utf-8");
- OkHttpClient client = new OkHttpClient();
- RequestBody body =RequestBody.create(JSON.toJSONString(accessTokenDTO),mediaType);//用fastjson將實體類轉換為json字符串傳入
- Request request = new Request.Builder()
- .url("https://github.com/login/oauth/access_token?cilen_id=xxx&client_secret=xxx"+accessTokenDTO.getCode()+
- "&redirect_uri=http://127.0.0.1:8080/callback&state=1")
- .post(body)
- .build();
- try (Response response = client.newCall(request).execute()) {
- String string = response.body().string();
- String token = string.split("&")\[0\].split("=")\[1\];
- return token;
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public GithubUser getUser(String token){
- OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder()
- .url("https://api.github.com/user?access_token="+token)
- .build();
- try (Response response = client.newCall(request).execute()) {
- String string = response.body().string();
- GithubUser githubUser = JSON.parseObject(string, GithubUser.class);//用fastjson將json字符串轉換為實體類
- return githubUser;
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
相關信息