使用码云提供的oauth2.0接口进行第三方登录认证


最近在做的一个小demo,使用了基于oauth2.0进行第三方认证,示例里面使用的是github,但是网络很差,有时候github进不去,所以换成了gitee(码云)。大致步骤是一样的,几乎没啥变化,这里我使用的通过授权码模式获取token

1. 创建应用

具体可以参考:官方文档

2 获取code

请求的url:

https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&&scope=user_info

这个接口里的client_id和redirect_uri都 是第一步生成的,response_type和scope对应的值都是不变的
它的原理就是当我们向这个url发送请求的时候,它就会返回一个code到我们的重定向url里面,返回的是这种形式:

http://localhost:8887/callback?code=60ade58a3f0d73dc2f59e69de84165a300ff7b7f81563df86158aaf5a1d87cf8

这里我把它封装到了accessToken对象里面:

@GetMapping("/callback")
 public String callback(@RequestParam(name="code") String code){
        AccessTokenDto accessTokenDto = new AccessTokenDto();
        accessTokenDto.setClient_id(clientId);
        accessTokenDto.setClient_secret(clientSecret);
        accessTokenDto.setCode(code);
        accessTokenDto.setRedirect_uri(redirectUri);
        String accessToken = githubProvider.getAccessToken(accessTokenDto);
        GithubUser user = githubProvider.getUser(accessToken);
        System.out.println(user);

        return "index";
    }

3 获取token

上一步里面,当返回code以后,我去调用getAccessToken方法,在里面通过okhttp发送了post请求去获取token,这个地方我觉得很奇怪,因为,它发送的是post请求,按理说不应该在请求的url里面拼接字符串了,但是我试了一下,如果不拼接的话,请求会出错,具体原因是什么我暂时还不清楚,这样就可以获得token了。

 MediaType mediaType
                = MediaType.get("application/json; charset=utf-8");

        OkHttpClient client = new OkHttpClient();
        System.out.println(accessTokenDto.toString());
       RequestBody body = RequestBody.create(JSON.toJSONString(accessTokenDto),mediaType);
        Request request = new Request.Builder()
                .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 str= response.body().string();
           // 返回的是下面这样一个字符串,所以先把它给转换成json对象,然后获取它里面对应的token
            // {"access_token":"783e1f8ec832e301ee9c831e201396a8","token_type":"bearer","expires_in":86400,"refresh_token":"5940b861e2bab8e2d2ffba74ebf320ede12af85245c4011c528e12a614cecb29","scope":"user_info","created_at":1585487419}
            JSONObject obj=JSONObject.parseObject(str);
           return obj.get("access_token").toString();

4 发送请求获取用户信息

gitee提供的有接口,可以通过token然后获取用户信息。

https://gitee.com/api/v5/user?access_token=+accessToken

根据上面获得的token,向这个url发送请求就可以获取用户信息了。
参考链接:
参考链接1
参考链接2

发布了314 篇原创文章 · 获赞 113 · 访问量 54万+

猜你喜欢

转载自blog.csdn.net/dream_follower/article/details/105186815