步骤一、在GitHub上设置一个OAuth App

举例

保存好secrets

步骤二、前端

  1. 设置一个按钮跳转到授权登录页

<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:认证后重定向的地址

GitHub授权页面

  1. 点击授权

会有一个跳转等待页

网络不稳定可能一直卡在这个页面

F12查看网络,可以看见网站向后端发了一个code码,这个code用来换取token

步骤三、编写后端代码

  1. 从配置文件中读取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;
    }
}
  1. 核心代码(有一些我自己项目里的代码,注意修改)

    //用来发送请求的工具类,这个网上有很多现成的
    @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";
        }
    }

总结流程

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐