實現Gitee的第三方登入筆記
阿新 • • 發佈:2022-03-08
參考資料:
前期準備:
建立要接入碼雲的應用。 具體步驟參考官網流程中的建立應用流程
步驟
1、建立一個SpringBoot專案
2、在頁面中寫一個 a 標籤,地址為
https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code
可以在後面加上 &state=1
目的:跳轉到第三方登入平臺進行授權登入
3、完成授權後,會跳轉到你設定的應用回撥地址 也就是redirect_uri 的地址,並帶回引數 state
和 code
例如我的回撥地址是 http://localhost:8089/callback
4、建立Controller類
@GetMapping("/callback")
public String callback(@RequestParam(name = "code")String code,
@RequestParam(name = "state")String state){
return "index";
}
完成授權後就會跳轉進入本地的 Controller
5、通過迴帶引數 state
和 code
再次訪問Gitee第三方應用 得到 access_token
5.1、建立實體類封裝物件
@Data
@Component
public class AccessTokenDto {
private Integer id;
private String client_id;
private String redirect_uri;
private String code;
private String state;
private String client_secret;
}
5.2、將client_id
、redirect_uri
client_secret
寫入配置檔案以方便日後修改
gitee:
client_id: ????
redirect_uri: http://localhost:8887/callback
client_secret: ?????
5.3、在Controller中將資料封裝成物件
@Controller
public class AuthorizeController {
@Autowired
AccessTokenDto accessTokenDto;
@Value("${gitee.client_id}")//獲取配置檔案中的資料
private String client_id;
@Value("${gitee.redirect_uri}")
private String redirect_uri;
@Value("${gitee.client_secret}")
private String client_secret;
@GetMapping("/callback")
public String callback(@RequestParam(name = "code")String code,
@RequestParam(name = "state")String state){
//封裝成物件
accessTokenDto.setClient_id(client_id);
accessTokenDto.setRedirect_uri(redirect_uri);
accessTokenDto.setClient_secret(client_secret);
accessTokenDto.setCode(code);
accessTokenDto.setState(state);
return "index";
}
}
5.3、編寫通過引數 state
和 code
得到 access_token
的方法
5.3.1、引入okhttp依賴 和fastjson依賴
<!--okhttp-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<!-- fastjson json轉換工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
5.3.2編寫方法
OKHttp官網中的方法體
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
視訊中寫的方法
public String getAccessToken(AccessTokenDto accessTokenDto){
MediaType mediaType = MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
//將物件轉化為JSON格式
RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accessTokenDto));
Request request = new Request.Builder()
//官網給的url的值:https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
.url("https://gitee.com/oauth/token?grant_type=authorization_code&code="+accessTokenDto.getCode()+"&client_id="+accessTokenDto.getClient_id()+"&redirect_uri="+accessTokenDto.getRedirect_uri()+"&client_secret="+accessTokenDto.getClient_secret())
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
String string = response.body().string();
// System.out.println(string);
String s = string.split(":")[1].split("\"")[1];//將得到的資料進行分割最終得到accessToken值
// System.out.println(s);
return s;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
5.3.3在Controller中呼叫該方法
6、通過得到的access_token
再次訪問第三方應用 得到含有使用者資訊的JSON資料
6.1、建立使用者實體類物件
@Data
public class GiteeUser {
private Integer id;
private String name;
private String email;
private String bio;
}
6.2編寫方法,通過accesstoken得到使用者資訊
public GiteeUser getUser(String accesstoken){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://gitee.com/api/v5/user?access_token="+accesstoken)
.build();
try {
Response response = client.newCall(request).execute();
String str = response.body().string();
GiteeUser giteeUser = JSON.parseObject(str, GiteeUser.class);//自動將JSON字串轉化為實體類物件
return giteeUser;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
6.3在Controller中呼叫方法
7、最終的Controller
@Controller
public class AuthorizeController {
@Autowired
AccessTokenDto accessTokenDto;
@Autowired
GiteeProvider giteeProvider;//兩個方法寫在該類中
@Value("${gitee.client_id}")
private String client_id;
@Value("${gitee.redirect_uri}")
private String redirect_uri;
@Value("${gitee.client_secret}")
private String client_secret;
@GetMapping("/callback")
public String callback(@RequestParam(name = "code")String code,
@RequestParam(name = "state")String state){
accessTokenDto.setClient_id(client_id);
accessTokenDto.setRedirect_uri(redirect_uri);
accessTokenDto.setClient_secret(client_secret);
accessTokenDto.setCode(code);
accessTokenDto.setState(state);
String accessToken = giteeProvider.getAccessToken(accessTokenDto);
GiteeUser user = giteeProvider.getUser(accessToken);
//驗證資訊
System.out.println(user.getName()+" "+user.getBio()+" "+user.getId());
return "index";
}
}