# 第三方登录

用户想要登录 A 网站,A 网站需要获取用户某个第三方平台的信息(头像、昵称等)。所以用户需要 “登录” 第三方平台才能获取到对应的信息,再把信息给到 A 网站。

# 为什么要用到 Oauth?

通过上面的需求,最简单的方法用户给予 A 网站第三方应用的账号密码,让 A 网站去登录再取得信息,这显然是不够安全的。
所以有了 Oauth 授权,简单来说是:A 网站请求授权,用户同意授权,然后第三方应用会生成一个令牌 code,它的作用和密码类似,但是令牌权限有限,并且是有效期的,还可以随时被用户撤销,所以是一种很好的解决方案。
而 A 网站要如何取到这个令牌,就有了以下的几种方式。

# Oauth2.0 的四种方式:

  • 授权码模式。这是最常用的一种方式,前端对第三方应用请求一个授权码 code,第三方应用将授权码 code 发到后端,然后后端用这个授权码 code 去请求一个用户令牌 token,保证通信交换都在后端完成,令牌对用户不可见。
  • 简化模式。比上面少了授权码的步骤,在浏览器中直接申请认证令牌,令牌对用户是可见的。
  • 密码式。直接把第三方账号密码交给 A 网站去登录,只建立在用户极度信任网站的前提下。
  • 凭证式(命令行)。适用于没有前端的命令行应用,即在命令行下请求令牌。

不管是上面的哪种方式,都需要到对应的第三方备案,取得两个身份识别码 client IDclient secret 用于说明自己的身份,防止令牌滥用。注意 client secret 是必须保密的,会放在后端。

由于 Github Oauth 文档明确指出 Web 应用只能使用授权码模式。alt text

# 授权码模式工作流程

  • 用户访问客户端,后者将前者导向认证服务器。
  • 用户选择是否给予客户端授权。
  • 假设用户给予授权,认证服务器将用户导向客户端事先指定的 "重定向 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 IDclient 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
2
3
4
headers: {
Authorization: `Bearer ${accessToken}`,
Accept: 'application/json',
},

参考文档:

  • 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
更新于

请我喝[茶]~( ̄▽ ̄)~*

imtangx 微信支付

微信支付

imtangx 支付宝

支付宝

imtangx 贝宝

贝宝