前言

OAuth 是一个关于授权的网络标准,是目前最流行的授权机制,用来授权第三方应用获取用户数据。目前版本是 2.0,也常常称为 OAuth2。

了解了这个标准,就可以在自己的网站实现第三方登录了,很酷。😄

简单来说,我们常用的 爱奇艺 等视频软件,我们在登录的时候可以选择账户密码登录,也可以选择第三方应用授权登录,比如 qq 和 微信,在授权登录后会有访问那个第三方应用的一些权限,比如访问到你的好友信息。那么这个第三方应用授权的过程是怎么样的?有哪几种方式?

以下说的爱奇艺和微信说的都是网页版的,可以当作两个网站理解。

  1. 最简单的方式莫过于,你输入微信的账号密码在爱奇艺登录,爱奇艺拿着你的微信的账号密码向微信服务端请求你的好友信息,并在爱奇艺展示给你。这就是 OAuth2 规定里的 密码式 授权方式
  2. 在爱奇艺输入微信的账号密码,这也太不安全了。还有一种方式是爱奇艺和微信合作,让微信给爱奇艺开放权限,这样爱奇艺本身就可以访问微信的全部用户信息,用户在登录爱奇艺的时候只需要输入微信号,爱奇艺就能从微信服务器访问到用户的好友信息。这就是 OAuth2 规定的 客户端凭证 授权方式。
  3. 第二种方式会有点麻烦,微信怎么愿意给爱奇艺权限,除非是一家公司的。那么还有一种方式。微信提供一个授权机制,允许三方软件拥有访问的权限。但是这个需要用户同意授权,爱奇艺调用特定的授权接口访问。具体流程是,用户进入爱奇艺后,选择微信的方式登录,链接跳转到微信的页面,用户登录微信,点击确定授予爱奇艺权限,微信会跳回到爱奇艺,并附带给爱奇艺一个 token,爱奇艺拿着这个 token 就可以访问微信的服务端数据了。这就是 OAuth2 规定的 隐藏式 授权。
  4. 第三种方式看似没有问题,但其实细想下,此时微信服务端访问权限的 token 是存储在前端浏览器的,是很容易暴露的。微信服务端会觉得不安全。因此又有了另外一种方式。用户进入爱奇艺后,选择微信的方式登录,链接跳转到微信的页面,用户登录微信,点击确定授权给爱奇艺,微信会跳回到爱奇艺,随之返回的并不是直接用于访问微信服务端的 token,而是个 code 授权码。爱奇艺拿着这个 code 访问自己的服务器,然后再由爱奇艺的服务器拿着这个 code 去访问微信的服务器拿到 token,并存储在自己的服务端,后续的请求就是,爱奇艺前端照样请求自己的服务端,爱奇艺的服务端再去请求微信的服务器。本质来说,就是 token 的存储由前端浏览器换到了后端服务器,会更安全。这就是 OAuth2 规定的 授权码 授权。

至于其中的一些细节,比如微信怎么在授权后回跳到爱奇艺的(通过 http 重定向),微信服务端又是怎么判断拿着授权码来请求 token 的是爱奇艺的前端还是后端服务器呢?等等,请自行查阅,最好是实践后会更清楚。

参考和推荐

https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
https://www.ruanyifeng.com/blog/2019/04/oauth_design.html
https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
https://www.ruanyifeng.com/blog/2019/04/github-oauth.html