鬂已星星也 發表於 2022-3-8 20:58:00

实现Gitee的第三方登录笔记

<h2 id="参考资料">参考资料:</h2>
<p>B站博主 飞翔的企鹅编号9527 的视频</p>
<p>B站博主 逆风微笑的代码狗 的视频</p>
<p>官方文档教程</p>
<p>OKHttp官网</p>
<h2 id="前期准备">前期准备:</h2>
<p><mark>创建要接入码云的应用</mark>。具体步骤参考官网流程中的创建应用流程</p>
<h2 id="步骤">步骤</h2>
<p><strong>1、创建一个SpringBoot项目</strong></p>
<p><strong>2、在页面中写一个 a 标签,地址为</strong></p>
<p><code>https://gitee.com/oauth/authorize?client_id={client_id}&amp;redirect_uri={redirect_uri}&amp;response_type=code</code></p>
<p>可以在后面加上 &amp;state=1</p>
<p><strong>目的</strong>:跳转到第三方登录平台进行授权登录</p>
<p><img src="https://img2022.cnblogs.com/blog/2033685/202203/2033685-20220308205342700-1565863328.png" alt="" loading="lazy"></p>
<p><strong>3、完成授权后,会跳转到你设置的应用回调地址 也就是redirect_uri 的地址,并带回参数 <code>state</code>和 <code>code</code></strong></p>
<p><strong>例如我的回调地址是http://localhost:8089/callback</strong></p>
<p><strong>4、创建Controller类</strong></p>
<pre><code class="language-java">    @GetMapping("/callback")
    public String callback(@RequestParam(name = "code")String code,
                           @RequestParam(name = "state")String state){

      return "index";
    }

</code></pre>
<p>完成授权后就会跳转进入本地的 Controller</p>
<p><strong>5、通过回带参数 <code>state</code>和 <code>code</code> 再次访问Gitee第三方应用 得到 <code>access_token</code></strong></p>
<p>5.1、创建实体类封装对象</p>
<pre><code class="language-java">@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;
}
</code></pre>
<p>5.2、将<code>client_id</code>、<code>redirect_uri</code>、<code>client_secret</code>写入配置文件以方便日后修改</p>
<pre><code class="language-yml">gitee:
client_id: ????
redirect_uri: http://localhost:8887/callback
client_secret: ?????
</code></pre>
<p>5.3、在Controller中将数据封装成对象</p>
<pre><code class="language-java">@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";
    }
}
</code></pre>
<p>5.3、编写通过参数 <code>state</code>和 <code>code</code> 得到 <code>access_token</code>的方法</p>
<p>5.3.1、引入okhttp依赖 和fastjson依赖</p>
<pre><code class="language-xml">&lt;!--okhttp--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;com.squareup.okhttp3&lt;/groupId&gt;
    &lt;artifactId&gt;okhttp&lt;/artifactId&gt;
    &lt;version&gt;4.9.0&lt;/version&gt;
&lt;/dependency&gt;

      &lt;!-- fastjsonjson转换工具 --&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
            &lt;artifactId&gt;fastjson&lt;/artifactId&gt;
            &lt;version&gt;1.2.78&lt;/version&gt;
      &lt;/dependency&gt;
</code></pre>
<p>5.3.2编写方法</p>
<p>OKHttp官网中的方法体</p>
<pre><code class="language-java">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();
}
}
</code></pre>
<p>视频中写的方法</p>
<pre><code class="language-java">    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&amp;code={code}&amp;client_id={client_id}&amp;redirect_uri={redirect_uri}&amp;client_secret={client_secret}
                .url("https://gitee.com/oauth/token?grant_type=authorization_code&amp;code="+accessTokenDto.getCode()+"&amp;client_id="+accessTokenDto.getClient_id()+"&amp;redirect_uri="+accessTokenDto.getRedirect_uri()+"&amp;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(":").split("\"");//将得到的数据进行分割最终得到accessToken值
//            System.out.println(s);
            return s;
      } catch (Exception e) {
            e.printStackTrace();
      }

      return null;
    }
</code></pre>
<p>5.3.3在Controller中调用该方法</p>
<p><strong>6、通过得到的<code>access_token</code>再次访问第三方应用 得到含有用户信息的JSON数据</strong></p>
<p>6.1、创建用户实体类对象</p>
<pre><code class="language-java">@Data
public class GiteeUser {

    private Integer id;
    private String name;
    private String email;
    private String bio;
}
</code></pre>
<p>6.2编写方法,通过accesstoken得到用户信息</p>
<pre><code class="language-java">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;
}
</code></pre>
<p>6.3在Controller中调用方法</p>
<p><strong>7、最终的Controller</strong></p>
<pre><code class="language-java">@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);

      //调用方法得到accessToken
      String accessToken = giteeProvider.getAccessToken(accessTokenDto);

      //调用方法得到用户信息
      GiteeUser user = giteeProvider.getUser(accessToken);

      //验证信息
      System.out.println(user.getName()+""+user.getBio()+" "+user.getId());

      return "index";
    }
}
</code></pre><br><br>
来源:https://www.cnblogs.com/13490-/p/15982491.html
頁: [1]
查看完整版本: 实现Gitee的第三方登录笔记