1. 程式人生 > 其它 >實現Gitee的第三方登入筆記

實現Gitee的第三方登入筆記

參考資料:

B站博主 飛翔的企鵝編號9527 的視訊

B站博主 逆風微笑的程式碼狗 的視訊

官方文件教程

OKHttp官網

前期準備:

建立要接入碼雲的應用。 具體步驟參考官網流程中的建立應用流程

步驟

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_idredirect_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、編寫通過引數 statecode 得到 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";
    }
}