github或者gitee第三方登录
首先我们需要在github或者gitee上申请一个应用



根据以上的图片在gitee中申请我们的一个应用
注意:

申请完成后我们就可以开始写代码了
这里是我的代码 , 大家跟着改一改就可以了
先来看一下我的项目结构 , 这部分只在github包中有涉及

写一个controller
package com.starcpdk.blogservice.github.controller;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.starcpdk.blogservice.github.enums.LoginType;
import com.starcpdk.blogservice.github.model.UserInfo;
import com.starcpdk.blogservice.github.service.GiteeServiceImpl;
import com.starcpdk.blogservice.github.service.GithubServiceImpl;
import com.starcpdk.commonutils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@RestController
public class IndexController {@Autowiredprivate GiteeServiceImpl giteeService;@AutowiredGithubServiceImpl githubService;@GetMapping(value = "/")public String index() {return "index";}@GetMapping(value = "/login")public String login() {return "login";}@GetMapping(value = "/oauth/login/{type}")public void login(@PathVariable String type , HttpServletResponse response) throws IOException {if (type.toUpperCase().equals(LoginType.GITHUB.toString())) {response.sendRedirect(githubService.authorizeUri());}response.sendRedirect(giteeService.authorizeUri());}@GetMapping(value = "/github/callback")public String callback(HttpServletRequest request, Model model) {String code = request.getParameter("code");JSONObject userInfo = githubService.getUserInfo(githubService.getAccessToken(code));UserInfo info = JSON.parseObject(userInfo.toString(), UserInfo.class);model.addAttribute("github", info);return "index";}@GetMapping(value = "/gitee/callback") // 只需要更改这里的代码地址为自己设置的回调地址就可以了 , 这个地方就是获取用户信息的请求public R giteeCallBack(HttpServletRequest request, Model model) {String code = request.getParameter("code");JSONObject userInfo = giteeService.getUserInfo(giteeService.getAccessToken(code));UserInfo info = JSON.parseObject(userInfo.toString(), UserInfo.class);model.addAttribute("gitee", info);return R.ok().data("gitee" , info);}
}
写一个枚举类
package com.starcpdk.blogservice.github.enums;public enum LoginType {/*** 登录类型*/GITEE,GITHUB;
}
写一个实体类
package com.starcpdk.blogservice.github.model;import lombok.Data;@Data
public class UserInfo {private Integer id;private String avatarUrl;private String login;private String bio;private String createdAt;private String htmlUrl;
}
接下来我们需要写一些授权登录的类
基础类
package com.starcpdk.blogservice.github.oauth;public interface BaseOauth {/*** 授权地址** @return 授权地址*/public String authorize();/*** 获取accessToken** @param code 请求编码* @return accessToken*/public String accessToken(String code);/*** 获取用户信息** @param accessToken token* @return user*/public String userInfo(String accessToken);
}
gitee
package com.starcpdk.blogservice.github.oauth;import org.springframework.stereotype.Component;@Component
public class GiteeOauth implements BaseOauth {private static final String GITEE_CLIENT_ID = "ef6f53b56b4cf4ed14ed66673b0d785d8d23443e1d6e9007e2781210a7e1aa60"; // 这里是我们注册gitee的应用时候生成的idprivate static final String GITEE_CLIENT_SECRET = "e0c4cfa99b18e77eaa58b60dfed10e7810b2316ddd609400cad4226e6a3ae147"; // 这里是我们注册gitee的应用时候生成的Secretprivate static final String REDIRECT_URI = "http://127.0.0.1:8081/gitee/callback"; // 这里的地址就是回调地址 , 填写的是在gitee上注册的应用程序时候的回调地址 , 同时这个回调地址需要在自己的项目中有对应的controller , 这个回调地址的意思就是授权后跳转到这个回调地址 , 这样我们就可以看到点击授权后会跳转到这个地址下面 , 我这里把这个地址设置为我自己的项目的一个地址 , 在controller中可以看到对应的这个地址@Overridepublic String authorize() {return "https://gitee.com/oauth/authorize?client_id=" + GITEE_CLIENT_ID + "&response_type=code&redirect_uri=" + REDIRECT_URI;}@Overridepublic String accessToken(String code) {return "https://gitee.com/oauth/token?grant_type=authorization_code&code=" + code + "&client_id=" + GITEE_CLIENT_ID + "&redirect_uri=" + REDIRECT_URI + "&client_secret=" + GITEE_CLIENT_SECRET;}@Overridepublic String userInfo(String accessToken) {return "https://gitee.com/api/v5/user?access_token=" + accessToken;}
}
github
package com.starcpdk.blogservice.github.oauth;import org.springframework.stereotype.Component;@Component
public class GithubOauth implements BaseOauth {private static final String GITHUB_CLIENT_ID = "3d00a49f8121305975c";private static final String GITHUB_CLIENT_SECRET = "4edd0d1css04100dd57c34cde45c1e21e0521b64b89";/*** 登陆授权类型*/@Overridepublic String authorize() {return "https://github.com/login/oauth/authorize?client_id=" + GITHUB_CLIENT_ID + "&scope=user,public_repo";}@Overridepublic String accessToken(String code) {return "https://github.com/login/oauth/access_token?client_id=" + GITHUB_CLIENT_ID + "&client_secret=" + GITHUB_CLIENT_SECRET + "&code=" + code;}@Overridepublic String userInfo(String accessToken) {return "https://api.github.com/user?access_token=" + accessToken + "&scope=public_repo%2Cuser&token_type=bearer";}
}
我们写一下service层
基础层
package com.starcpdk.blogservice.github.service;import com.alibaba.fastjson.JSONObject;public interface BaseOauthService {String authorizeUri();String getAccessToken(String code);JSONObject getUserInfo(String accessToken);}
gitee
package com.starcpdk.blogservice.github.service;import com.alibaba.fastjson.JSONObject;
import com.starcpdk.blogservice.github.oauth.GiteeOauth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class GiteeServiceImpl implements BaseOauthService {@AutowiredGiteeOauth giteeOauth;@AutowiredRestTemplate restTemplate;@Overridepublic String authorizeUri() {return giteeOauth.authorize();}@Overridepublic String getAccessToken(String code) {String token = giteeOauth.accessToken(code);ResponseEntity<Object> entity = restTemplate.postForEntity(token, httpEntity(), Object.class);Object body = entity.getBody();assert body != null;String string = body.toString();String[] split = string.split("=");String accessToken = split[1].toString().split(",")[0];return accessToken;}@Overridepublic JSONObject getUserInfo(String accessToken) {String userInfo = giteeOauth.userInfo(accessToken);ResponseEntity<JSONObject> forEntity = restTemplate.exchange(userInfo, HttpMethod.GET, httpEntity(), JSONObject.class);JSONObject body = forEntity.getBody();return body;}public static HttpEntity httpEntity() {HttpHeaders headers = new HttpHeaders();headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpEntity<HttpHeaders> request = new HttpEntity<>(headers);return request;}
}
github
package com.starcpdk.blogservice.github.service;import com.alibaba.fastjson.JSONObject;
import com.starcpdk.blogservice.github.oauth.GithubOauth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.Objects;import static com.starcpdk.blogservice.github.service.GiteeServiceImpl.httpEntity;@Service
public class GithubServiceImpl implements BaseOauthService {@AutowiredGithubOauth githubOauth;@Autowiredprivate RestTemplate restTemplate;@Overridepublic String authorizeUri() {return githubOauth.authorize();}@Overridepublic String getAccessToken(String code) {String token = githubOauth.accessToken(code);ResponseEntity<Object> forEntity = restTemplate.exchange(token, HttpMethod.GET, httpEntity(), Object.class);String[] split = Objects.requireNonNull(forEntity.getBody()).toString().split("=");String accessToken = split[1].split(",")[0];return accessToken;}@Overridepublic JSONObject getUserInfo(String accessToken) {String userInfo = githubOauth.userInfo(accessToken);ResponseEntity<JSONObject> entity = restTemplate.exchange(userInfo, HttpMethod.GET, httpEntity(), JSONObject.class);JSONObject body = entity.getBody();return body;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
