我爱编程Java

Java 实现 Github 第三方登陆

2018-04-05  本文已影响0人  leewaiho

前言

最近公司需要做一系列第三方登录,其中一个就是Github的第三方登录,这里就把过程记录下来,方便日后温习,也希望能给读者提供一些帮助。

技术

主要还是调用Github 的 Rest API v3 接口, 所以只要能有http客户端能够发送请求就可以,业务实现就看个人自己啦。
我这边采用的是SpringBoot的一系列框架。 http请求是使用 Spring中的RestTemplate来发送的。

准备工作

  1. 首先在Github->Settings->Developer Settings 页面右上角点击 New OAuth App
    New OAuth App 页面
  2. 其中 Application name 会在请求用户授权的时候显示, Authorization callback URL填写的地址会在用户授权成功后跳转

这里填写的信息之后都可以再次修改

  1. 在创建完OAuth App后 我们可以在 Developer Settings 页面看到我们新建的APP了,进入查看详情,我们需要关注比较重要的3个参数。
名称 备注 Example
Client ID OAuth App的账户 9f232c210ed1cada9a9b
Client Secret OAuth App的密码 不告诉你
Authorization callback URL 请求用户授权成功后会重定向跳转的地址 http://localhost:8080/github.html

正文

我们的需求是能够在网页上登录的时候使用Github OAuth Login 所以我们就采用 Web Application flow 的方法。
根据文档说明,Web应用认证流程分为以下几步:

  1. 用户被第三方客户端(也就是我们的应用)重定向至Github官网请求用户授权。
  2. 用户被Github带上短暂有效的code重定向回第三方客户端( 根据Authorization callback URL 指定的地址。
  3. 第三方客户端 可以带着通过code向Github换取的用户token访问Github API 得到用户的资源。

1. 请求用户授权

Reference: https://developer.github.com/apps/building-oauth-apps/authorization-options-for-oauth-apps/#1-users-are-redirected-to-request-their-github-identity

名称 必填 备注 Example
client_id OAuth APP的Client ID;不记得的话往上翻 9f232c210ed1cada9a9b
scope 请求用户授权的作用域;列表 user,gist,repo, write:public_key
redirect_uri 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值
state 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值
allow_signup 用于是否允许用户现在Github注册再进一步进行授权,默认是true

根据文档说明,我们要获得用户授权的方式就是将用户重定向至Github的授权页面。
GET - https://github.com/login/oauth/authorize
那么这里有几个参数是至关重要的

名称 必填 备注 Example
client_id OAuth APP的Client ID;不记得的话往上翻 9f232c210ed1cada9a9b
scope 请求用户授权的作用域;列表 user,gist,repo, write:public_key
redirect_uri 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值
state 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值
allow_signup 用于是否允许用户现在Github注册再进一步进行授权,默认是true

恩,那么说明有了,剩下就要举个栗子:
https://github.com/login/oauth/authorize?client_id=9f232c210ed1cada9a9b&scopes=user,repo,admin:public_key
在进行授权之后,就会带上code跳转至callback URL
例:
http://localhost:8080/github.html?code=21f82602133f1a4ee2c4

2. 处理code换取用户access_token

Reference: https://developer.github.com/apps/building-oauth-apps/authorization-options-for-oauth-apps/#2-users-are-redirected-back-to-your-site-by-github

名称 必填 备注 Example
client_id OAuth APP的Client ID;不记得的话往上翻 9f232c210ed1cada9a9b
client_secret OAuth APP的Client Secret;不记得的话往上翻 不告诉你
code 第一步返回来的code 21f82602133f1a4ee2c4
redirect_uri 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值
state 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值

这里换取access_token的地址呢就是
post - https://github.com/login/oauth/access_token
参数说明:

名称 必填 备注 Example
client_id OAuth APP的Client ID;不记得的话往上翻 9f232c210ed1cada9a9b
client_secret OAuth APP的Client Secret;不记得的话往上翻 不告诉你
code 第一步返回来的code 21f82602133f1a4ee2c4
redirect_uri 授权后要跳转的地址;若是填了那么第二步请求也应该填相同的值
state 用于防止攻击的随机码;若是填了那么第二步请求也应该填相同的值

在这一步中 我们就要通过java调用restTemplate去Github服务器请求Github 用户的access_token

  // 代码之后补上哦

3. 至此结束

得到access_token后我们就可以愉快的去访问Github API啦,如果出现权限不够的情况,那么就请回到第一步去根据需要调整scope

顺便介绍一下在在Github API请求中带token的几种方法

  1. Headers
    在Http Headers中设置
Key Value
Authorization token ${access_token}
  1. URL Params
    在访问的URL中带上参数access_token=${access_token}
    例如:
    https://api.github.com/user?access_token=${access_token}

参考文献

Github API - 官方文档
Github OAuth App 用户授权选项
理解OAuth 2.0 - 阮一峰

上一篇 下一篇

猜你喜欢

热点阅读