三土土三

导航

使用gitee进行第三方登录

问题:gitee第三方登录

解决方法:调用API,

 

 

gitee做第三方登录的大致过程为:首先,在码云端创建一个第三方应用,生成id,secret,并且填写我们系统的主页地址和回调地址,通过一个超链接跳转至码云授权页面,
点击授权之后码云服务器会返回到我们所填写的回调地址中并且携带两个参数,一个是code,一个是state,然后我们携带code,state,和生成的相关条目,
如id,secret等请求token,码云服务器收到请求之后返回token,然后我们携带token再次访问码云服务器,服务器给我们返回相关的用户信息。

 

1.首先,在gitee创建一个第三方应用。

2.找到第三方应用,并点击右上角的创建应用。

3.填写相关信息,创建应用,只勾选第一个权限即可。

4.生成相关信息

至此,gitee上的第三方应用创建完毕。

5.在页面上使用连结到gitee的某个地址,在这个地址上需要填入上面生成的client—id,redirect—uri。

<a href="https://gitee.com/oauth/authorize?client_id=你的id&redirect_uri=http://localhost:8887/callback&response_type=code&state=1">登录</a>

6.点击登录会跳转至授权页面,如果授权成功跳转404说明链接地址正确,接下来需要 编写回调请求及其方法。

7.首先,引入两个相关依赖。

<dependency>
           <groupId>com.squareup.okhttp3</groupId>
           <artifactId>okhttp</artifactId>
           <version>3.14.1</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.78</version>
       </dependency>

8.使用okhttp发起post请求,码云服务器返回token,需要携带相关参数,我们直接封装成一个AccessTokenDTO对象,接下来我们还需要使用token获取用户相关信息,将用户也封装成一个GitUser对象。

AccessTokenDTO对象封装
package com.yf.community.dto;

import org.springframework.stereotype.Component;

@Component
public class AccessTokenDTO {
   private String client_id;
   private String client_secret;
   private String code;
   private String redirect_uri;
   private String state;

   public String getClient_id() {
       return client_id;
  }

   public void setClient_id(String client_id) {
       this.client_id = client_id;
  }

   public String getClient_secret() {
       return client_secret;
  }

   public void setClient_secret(String client_secret) {
       this.client_secret = client_secret;
  }

   public String getCode() {
       return code;
  }

   public void setCode(String code) {
       this.code = code;
  }

   public String getRedirect_uri() {
       return redirect_uri;
  }

   public void setRedirect_uri(String redirect_uri) {
       this.redirect_uri = redirect_uri;
  }

   public String getState() {
       return state;
  }

   public void setState(String state) {
       this.state = state;
  }
}

GiteeUser对象封装。

package com.yf.community.dto;

public class GiteeUser {
   private String name;
   private Long id;
   private String bio;

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public Long getId() {
       return id;
  }

   public void setId(Long id) {
       this.id = id;
  }

   public String getBio() {
       return bio;
  }

   public void setBio(String bio) {
       this.bio = bio;
  }
}

 

请求码云服务器

package com.yf.community.provider;


import com.alibaba.fastjson.JSON;
import com.yf.community.dto.AccessTokenDTO;
import com.yf.community.dto.GiteeUser;
import okhttp3.*;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class GitheeProvider {
   //发起post请求获取token
   public String getAccessToken(AccessTokenDTO accessTokenDTO){
       MediaType mediaType= MediaType.get("application/json; charset=utf-8");
       OkHttpClient client = new OkHttpClient();
       RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accessTokenDTO));
       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 string = response.body().string();
           System.out.println(string);
           String str1 = string.split(":")[1];
           String str2 = str1.split("\"")[1];
           return str2;
      } catch (IOException e) {
           e.printStackTrace();
      }
       return null;
  }
   //发起get请求返回GitUser对象,
   public GiteeUser getGiteeUser(String token){
       OkHttpClient client = new OkHttpClient();
       Request request = new Request.Builder()
              .url("https://gitee.com/api/v5/user?access_token="+token)
              .build();
       try (Response response = client.newCall(request).execute()) {
           String string=response.body().string();
           GiteeUser giteeUser = JSON.parseObject(string, GiteeUser.class);
           return giteeUser;
      } catch (IOException e) {
           e.printStackTrace();
      }
       return null;
  }
}

回调请求编写业务,成功返回我们需要的用户信息。

package com.yf.community.controller;

import com.yf.community.dto.AccessTokenDTO;
import com.yf.community.dto.GiteeUser;
import com.yf.community.provider.GitheeProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class AuthorizeController {
   @Autowired
   private AccessTokenDTO accessTokenDTO;
   @Autowired
   private GitheeProvider githeeProvider;
   @GetMapping("/callback")
   public String callback(@RequestParam(name = "code") String code,
                          @RequestParam(name = "state") String state){
       accessTokenDTO.setClient_id("你的id");
       accessTokenDTO.setClient_secret("你的secret");
       accessTokenDTO.setRedirect_uri("http://localhost:8887/callback");
       accessTokenDTO.setCode(code);
       accessTokenDTO.setState(state);
       String token = githeeProvider.getAccessToken(accessTokenDTO);
       GiteeUser giteeUser = githeeProvider.getGiteeUser(token);
       System.out.println("id :"+giteeUser.getId());
       System.out.println("name :"+giteeUser.getName());
       System.out.println("bio :"+giteeUser.getBio());
       return "index";
  }
}

 

posted on 2021-09-14 10:43  弓长三土  阅读(2778)  评论(0编辑  收藏  举报