02月04, 2018

OAuth 2.0 介绍

一、OAuth 2.0 是什么?

OAuth 是一个授权的网络标准。我们经常会遇见和使用到它。比如我在码云页面登录时:

alt

可以选择 QQ 授权登录,点击后进入如下页面:

alt

注意它上面的 URL 是https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101284669&redirect_uri=https%3A%2F%2Fgitee.com%2Fauth%2Fqq_connect%2Fcallback&response_type=code&state=1e1d7cedc6fc07946b3ef18ec5284b58eaaf5da0f9228fdf

大家可以看到该 URL 中含有 oauth2.0 的字符,也就意味着使用的是 OAuth 2.0 授权机制,稍后我们再来详细的解析这些参数的意义。

点击头像登录后,会被要求完善码云账户信息:注册一个新的账号或者绑定一个已有的码云账号

alt

码云这里是强制要求将用户的 QQ 账号和码云自有的用户体系的对应账号绑定,这是大部分系统和服务都会采取的做法。以自有的用户体系为主,其他的第三方的绑定为辅,两者相互绑定后,可以获取 QQ 头像、昵称和性别等资料,也可以直接使用 QQ 登录。

二、OAuth 2.0 的原理

假设我们要开发一个软件或者应用。或者干脆直白粗暴点:假如我们现在就开发一个“码云”。首先在版本 v1.0 时,我们会建立我们自己的用户体系,使用我们自己的用户名和密码来登录,我们称“码云”为我们的 Application ,普通使用者即为用户 “User” 。而在版本 v2.0 时,我们希望把 QQ 登录、微信登录、微博登录等其他登录方式增加进来,进一步提升用户体验。我们以 QQ 为例, 称 “QQ” 为 API。 在 API 里,又会有授权服务器和资源服务器。如下图:

alt

对应如下:

alt

在码云中使用 QQ 登录时,用户需要输入自己的 QQ 用户名和密码

alt

是不是意味着码云这里会保存着用户的 QQ 用户名和密码?

大家如果注意观察可以看到,上图页面所显示的 URL 地址其实不是码云的地址,而是归属 QQ 的域名地址,是以 https://graph.qq.com 打头的,而码云并没有获取到用户输入的用户名和密码,所以用户如果号被盗了,可不关码云的事。

URL 后面这一大长串的参数,分别代表什么意思呢?

which=Login&display=pc&client_id=101284669&redirect_uri=https%3A%2F%2Fgitee.com%2Fauth%2Fqq_connect%2Fcallback&response_type=code&state=634f9a59186e66a9f79686ff2838b501a67d88fd0154d96d

以上的 client_id、redirect_uri、response_type 和 state 以及这里没有出现的 scope 参数是 OAuth 2.0 常用参数,而其他参数则是 QQ 自定义的,用作区分或其他目的。

response_type:必选,表示授权的类型

client_id:必选,表示Application(也叫客户端,其实这里就是码云)的唯一标识,是 QQ 用来给码云的一个标识

redirect_uri:可选,重定向的 URI ,就是成功登陆后的页面跳转到哪里去,如上
 https%3A%2F%2Fgitee.com%2Fauth%2Fqq_connect%2Fcallback 是码云的地址

scope:可选,表示申请的权限范围,也是 QQ 区分客户权限的,比如可能有 VIP、VVIP 之类的

state:可选,可以任意设置,QQ 会原封不动的返回,表示 客户端的状态

好了,形象的例子看完了,我们来看抽象的图:

alt

还是以 码云 和 QQ 为例,整个流程如下:

  1. 用户(User)访问码云,点击 QQ 授权登录;
  2. 码云(Application)带参数跳转到 QQ 登录页;
  3. 用户(User)输入用户名和密码,发送 Authorization Request 给 QQ 的授权服务器(Authorization Server);
  4. QQ 的授权服务器(Authorization Server)给码云(Application)授权(Authorization Grant);
  5. 码云 Application 去拿授权(Authorization Grant)换取 Access Token;
  6. 码云 Application 拿 Access Token 访问资源服务器(Resource Server)获取所需资源(例如本例中的头像、昵称和性别),至此 OAuth 2.0 整个流程走完。

OAuth 2.0 实际上定义了四种授权方式,以上的例子只是介绍了其中最常见的一种(授权码模式),四种授权方式具体如下:

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

由于时间关系,其他三种方式以后再做介绍,感谢各位看官,晚安~

本文链接:https://www.daguanren.cc/post/oauth_2_introduction.html

-- EOF --

Comments