步骤一、在GitHub上设置一个OAuth App
步骤二、前端
设置一个按钮跳转到授权登录页
<a href="https://github.com/login/oauth/authorize?
client_id=b9c6b520a5fe17cad4d4&
redirect_uri=http://localhost:20000/oauth/redirect">GitHub</a>
client_id:GitHub网站接入提供的 APP KEY
redirect_uri:认证后重定向的地址
点击授权
会有一个跳转等待页
F12查看网络,可以看见网站向后端发了一个code码,这个code用来换取token
步骤三、编写后端代码
从配置文件中读取clientId和clientSecret,当然硬编码也行
@Component
@ConfigurationProperties(prefix = "github")
public class GitHubOAuthInfo {
private String clientId;
private String clientSecret;
public GitHubOAuthInfo() {
}
public GitHubOAuthInfo(String clientId, String clientSecret) {
this.clientId = clientId;
this.clientSecret = clientSecret;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return clientSecret;
}
public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
}
}
核心代码(有一些我自己项目里的代码,注意修改)
//用来发送请求的工具类,这个网上有很多现成的
@Autowired
RestTemplateUtil restTemplateUtil;
//用户模块远程调用接口
@Autowired
MemberFeignService memberFeignService;
//clientId和clientSecret
@Autowired
GitHubOAuthInfo gitHubOAuthInfo;
@GetMapping("/redirect")
public String redirect(String code, HttpSession session) {
//拿到code,clientId和clientSecret去获取accessToken
String getAccessTokenUrl = "https://github.com/login/oauth/access_token";
HttpHeaders headers = new HttpHeaders();
List<MediaType> mediaTypes = new ArrayList<>();
//请求头accept设置为:application/json
mediaTypes.add(MediaType.APPLICATION_JSON);
headers.setAccept(mediaTypes);
HashMap<String, String> requestBody = new HashMap<>(16);
requestBody.put("client_id", gitHubOAuthInfo.getClientId());
requestBody.put("client_secret", gitHubOAuthInfo.getClientSecret());
requestBody.put("code", code);
//请求路径,请求头,请求体,请求响应结果类型,路径参数
ResponseEntity<String> responseEntity = restTemplateUtil.post(getAccessTokenUrl, headers, requestBody, String.class, new HashMap<>(16));
String accessTokenJson = responseEntity.getBody();
ObjectMapper objectMapper = new ObjectMapper();
//转换带下划线的属性为驼峰属性
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
AccessToken accessToken = null;
try {
accessToken = objectMapper.readValue(accessTokenJson, AccessToken.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//拿令牌去获取信息
headers.set("Authorization", "token " + accessToken.getAccessToken());
String getUserInfoUrl = "https://api.github.com/user";
ResponseEntity<String> response = restTemplateUtil.get(getUserInfoUrl, headers, String.class, new HashMap<>(16));
//body:GitHub用户信息
String body = response.getBody();
GitHubUserInfo gitHubUserInfo = JSON.parseObject(body, GitHubUserInfo.class);
gitHubUserInfo.setToken(accessToken.getAccessToken());
//知道当前是哪个社交用户
//1.当前用户如果是第一次进网站,自动注册进来(为当前社交用户生成一个会员信息账号,以后这个社交账号就对应指定的会员)
R login = memberFeignService.login(gitHubUserInfo);
if (login.getCode() == 0) {
MemberRespVo data = login.getData("data", new TypeReference<MemberRespVo>() {
});
session.setAttribute(AuthServerConstant.LOGIN_USER, data);
return "redirect:http://meiwei.com";
} else {
return "redirect:http://auth.meiwei.com/login.html";
}
}