三方应用登录接入github方案
流程概览
GitHub采用的是OAuth 的方式授权
OAuth 授权原理步骤
- 网站携带 ClientID 跳转到 GitHub 授权页面
- 用户授权后,GitHub 携带授权码重定向回到网站回调页面
- 网站通过授权码向 GitHub 请求用户令牌(Token)(验证授权码合法性)
- 网站通过用户令牌请求用户信息(或其它接口)
Github三方认证流程
1.首先需要在github上创建一个OAuth App:OAuth App管理地址
注意最后一个回调地址(前/后端均可),当用户点击授权后,GitHub 会携带 授权码(code) 回调/重定向到这个地址。这个地址可以是任意合法的地址,比如http://localhost:8080/ 在本地开发调试的使用。回调时,GitHub 会追加一个名为code的查询参数到刚刚指定的回调地址中。(这个名为code的参数是hardcode的)比如:blog.twofei.com/login?type=… 注意后面的code 部分。
另外,由于这是一个追加到 URL 中的查询参数,而且很明显是通过浏览器重定向回调的,所以这是一个 GET 请求,不是 POST。
创建好后,就可以拿到 Client ID 和对应的 Client Secret,同时还可以设置一个头像。Client ID 可以公开,Client Secret 请不要泄露。
2.首先我们用户访问网站首页,点击登录时候进行的是自己逻辑的构造,这里会将那些client ID 和redirect_uri进行一个处理,然后才会发送到Github上github.com/login/oauth… (这些信息文档github三方登录文档里都有写到),进行验证授权,这个时候,Github会回调我们的redirect-uri,携带code信息。
在三方应用登录处点击github登录,请求路径类似:
https://github.com/login/oauth/authorize?
client_id=xxxxxxxxxxxxxxxxxxxxxxxx&
redirect_uri=xxxxxxxxxxxxxxxxxx
client_id
:创建OAuthApp后会返回的client_id
redirect_uri
:在创建OAuthApp时候填写的回调地址
3.访问授权后,github会询问用户是否授权并请求数据
用户同意授权, GitHub 就会跳转到redirect_uri
指定的跳转网址,并且带上授权码,跳转回来的 URL 就是下面的样子。
http://localhost:8080/oauth/redirect?
code=xxxxxxxxxxxxxxxxx
后端收到这个请求后,就拿到了授权码(code),接下来后端只需要通过请求取到code的值即可
4.拿到必备参数后,向Github请求令牌
GitHub 的令牌接口POST github.com/login/oauth… 需要提供三个参数
-
client_id:客户端id,即创建OAuthApp返回的ID
-
client_secret:客户端秘钥,这个创建OAuthApp后同时也会返回
-
code:上一步我们拿到的授权码
5.作为回应,GitHub 会返回一段 JSON 数据,里面包含了令牌accessToken
有了token后,就可以向github请求数据了
上面代码中,GitHub API 的地址是 api.github.com/user ,请求的时候必须在 HTTP 头信息里面带上令牌Authorization: token xxxxxxx
然后,就可以拿到用户数据,得到用户的身份
6.拿到用户身份后,如果本地数据库没有用户信息,就创建用户,有则生成自己的token进行登录
需要配置:
- 提供一个回调地址(前端):
在前端发起步骤2向github发起认证后,github会回调并重定向去改地址
-
在github账号上创建一个OAuthApp,创建后获取参数:
- clientId
- clientSecret
前端页面
- 登录页面
用户进入三方程序选择登录进入登录页面
选择github登录:发起请求GET https://github.com/login/oauth/authorize
并携带参数:client_id 与 redirect_uri两个参数
- 重定向页面:
用户在登录页面选择使用github登录后,会跳转到github验证
验证通过后,会向跳转到重定向页面,并且发起GET请求,携带query参数code
例如我的重定向地址为:http://localhost:8080/oauth/redirect
那么我在github验证通过后会跳转到 http://localhost:8080/oauth/redirect?code=xxxxxxxxxxx 这个页面,需要前端将这个请求的code参数发送给后端,后端认证后会返回 token
后端接口
1.前端重定向后向后端发起带query参数code的请求,后端发起post请求:github.com/login/oauth…
携带参数:
- code
- client_id
- client_secret
请求后获取json内容,拿到access_token参数
发起请求GET:api.github.com/user, 在请求头里携带access_token
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com/user
判断该用户在三方应用中存不存在,不存在就创建,之后生成自己平台的token返回给前端