# 第三方登录
用户想要登录 A 网站,A 网站需要获取用户某个第三方平台的信息(头像、昵称等)。所以用户需要 “登录” 第三方平台才能获取到对应的信息,再把信息给到 A 网站。
# 为什么要用到 Oauth?
通过上面的需求,最简单的方法用户给予 A 网站第三方应用的账号密码,让 A 网站去登录再取得信息,这显然是不够安全的。
所以有了 Oauth 授权,简单来说是:A 网站请求授权,用户同意授权,然后第三方应用会生成一个令牌 code,它的作用和密码类似,但是令牌权限有限,并且是有效期的,还可以随时被用户撤销,所以是一种很好的解决方案。
而 A 网站要如何取到这个令牌,就有了以下的几种方式。
# Oauth2.0 的四种方式:
- 授权码模式。这是最常用的一种方式,前端对第三方应用请求一个授权码 code,第三方应用将授权码 code 发到后端,然后后端用这个授权码 code 去请求一个用户令牌 token,保证通信交换都在后端完成,令牌对用户不可见。
- 简化模式。比上面少了授权码的步骤,在浏览器中直接申请认证令牌,令牌对用户是可见的。
- 密码式。直接把第三方账号密码交给 A 网站去登录,只建立在用户极度信任网站的前提下。
- 凭证式(命令行)。适用于没有前端的命令行应用,即在命令行下请求令牌。
不管是上面的哪种方式,都需要到对应的第三方备案,取得两个身份识别码 client ID 和 client secret 用于说明自己的身份,防止令牌滥用。注意 client secret 是必须保密的,会放在后端。
由于 Github Oauth 文档明确指出 Web 应用只能使用授权码模式。
# 授权码模式工作流程
- 用户访问客户端,后者将前者导向认证服务器。
- 用户选择是否给予客户端授权。
- 假设用户给予授权,认证服务器将用户导向客户端事先指定的 "重定向 URI"(redirection URI),同时附上一个授权码。
- 客户端收到授权码,附上早先的 "重定向 URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
- 认证服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌(access token)。
# Github Oauth 接入 Github 登录 (authCode) 实例
# 在 Github 注册一个 Oauth 应用
像上面说的,你需要到对应的第三方备案,在这里填好对应信息。
Application name: 你的网站应用名称Homepage URL: 调用接口的网址。本地开发可以设为http://localhost:8080。Authorization callback URL: 回调地址。就是获得授权之后会重定向到的地址。本地开发可以设为http://localhost:8080/auth/github/callback。
提交之后,你就会获得属于这个 Oauth 应用的 client ID 和 client secret 。
# 如何获得授权码
向第三方取得授权码 code,需要在 https://github.com/login/oauth/authorize 后加上查询参数,来让第三方知道你的身份及你要怎么申请。
client ID: 必填。用于识别你对应的 Oauth 应用。redirect_uri: 获得授权码后的回调地址。它可以是Authorization callback URL的子路径。scope: 权限控制。即 A 网站可以获得用户在 Github 上的权限大小。response_type: 后跟=code。代表现在以授权码方式请求。
# 如何获得令牌
获得授权码之后,重定向到 redirect_uri 。URL 后会跟上 ?code=xxx 就是你的授权码。然后要对 https://github.com/login/oauth/access_token 发出 POST 请求令牌。
client ID: 上文一致。client secret: 上文一致。code: 获得的授权码。redirect_uri: 用于双重验证。
# 用令牌获取信息
你已经取得了令牌。现在对 https://api.github.com/user 发出 GET 请求,需要在请求头带上你刚刚取得的令牌 accessToken。
1 | headers: { |
参考文档:
- https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
- https://docs.github.com/zh/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps