GitHub OAuth授权登录
OAuth
第三方登入主要基于OAuth 2.0。OAuth(开放授权)协议是一个开放标准,为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的
---- 百度百科
实现步骤
GitHub OAuth API官方文档
- 创建OAuth App
这里的Authorization callback URL在后文中会介绍
这里仅做本地开发,所以填了本地地址,如果项目部署好了,应该填http://xxx/callback
打开OAuth documentation查看官方文档
GitHub授权流程
- 这里介绍了如何使自己的项目获取GitHub授权的流程:
第一步:跳转至GitHub去请求认证
第二步:认证成功后,由GitHub跳转回我自己的项目
第三步:我自己的项目通过GitHub跳转回来时带的access token
去访问GitHub API
Step1.
这是第一步去GitHub认证的request所需带的参数,通过
GET
方式发送该请求https://github.com/login/oauth/authorize
,并带参数
注册OAuth App后会提供一个client_id
认证成功后回跳转到redirect_uri
页面
login
参数指定一个账户去获取授权
scope
是授权后我们想要拿到的信息,这里我只需要user
state
参数非必需,用于防治跨域伪造请求攻击
allow_signup
就是是否向未认证的用户提供注册GitHub的选项,默认是允许的
####Step2
如果GitHub用户接受该授权请求,则GitHub将带着
code
和state
参数重定向到自己之前注册的那个callback地址,我这里填的是http://localhost:8080/callback
,因此授权成功后会跳转至下面这个网址,这里看到带了code
参数,state
就是上一步请求中带的state
参数,原样返回。这里服务端需要接收这个code
和state
参数用于之后获取access_token
。
http://localhost:8080/github/oauth/callback?code=14de2c737aa02037132d&state=1496989988474
拿到请求中的
code
参数后服务端向https://github.com/login/oauth/access_token
这个API发送POST
请求,并且在该请求中带上client_id
,client_secret
,code
参数,请求成功后会返回带有access_token
的信息。
这里请求返回的Json格式信息是
access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer
,而我们需要的token是e72e16c7e42f292c6912e7710c838347ae178b4a
,因此在处理时要注意。
Step3.
获取到
access_token
后, 再调用https://api.github.com/user?access_token=xxx
这个API,就可以获取之前scope
中对应的GitHub用户信息。 用户的基本信息内容如下所示, 根据第一步传入的不同的 scope,获取到的用户信息也是不同的,博客后台使用 login 字段作为用户的唯一标示。
整个流程的顺序图
这里再盗一张linwalker在第三方登入例子-GitHub授权登入(node-koa)中的图
实现
Step1.
点击“登录”,向GitHub发送授权请求
<li th:if="${session.user == null}">
<a href="https://github.com/login/oauth/authorize?client_id=xxx&redirect_uri=http://localhost:8080/callback&scope=user&state=1">登录</a>
</li>
Step2.
GitHub带参数code回调callback地址
服务端拿到code参数POST请求GitHub获取access_token
GitHub返回access_token
服务端拿到access_token请求用户信息,之后将该用户信息存到数据库实现持久化
AuthorizeController
处理callback
页面
@Controller
public class AuthorizeController {
@Autowired
private GithubProvider githubProvider;
//在application.properties中配置github.