| 6 min read

在日常的网站中,我们经常会看见一些来自社交网站的登录按钮,类似使用facebook,twitter登录等。而在这背后则是建立在OAuth基础之上。OAuth2是一套提供授权功能的框架,通过它我们可以使第三方站点获取到我们的用户授权,就像可以拿到facebook 或者微博的用户昵称和头像。OAuth2 提供了包括桌面,web以及移动端应用的授权功能。

授权角色

授权一般会定义下面四种身份:

  • 用户
  • 客户端
  • 资源服务器
  • 授权服务器

用户

我们通常定义资源的所有者(Resource Owner)即是我们的用户,是他们允许这些应用去访问他们自己的账户信息。当然这些应用所能访问的权限是有限的,它被限制在一个受保护的作用域内(比如只能读取信息,当然这取决于我们自己的设计).

授权服务器和接口服务

用户请求授权服务后成功后,会返回一个aceess token给应用,这样应用再访问其他接口服务时候都需要这个凭证.

客户端应用

客户端应用既是用户当前所用的这个产品了。它通过它用户授权成功后,可以对用户的一些信息进行访问或者修改,但无论如何,再请求用户信息的时候,我们的api和授权服务必须对它进行合法性验证。

授权流程

应用注册

使用授权之前,你必须让这些客户端应用登记在案,你需要它提供一些基本的信息名称比如,应用名称,网站地址,回调地址等等。其中回调地址既是用户完成授权后跳向的地址,在那里应用能够处理我们返回的授权代码以及access tokens.

Cient ID 以及 Client Secret

当应用注册完成后,我们会颁布给应用一个授权证书,里面大致记录了客户端的唯一识别(client identifier)和客户端的安全码(client secret).
Client ID 是一串暴漏的字符串,用户构建访问的url以及用于服务器的验证。Client Secret则被用来认证应用的唯一性,从而保证应用和api服务的私秘性。

授权许可

在前面的流程中,第一步使是获取授权许可和acess token.授权许可的类型取决于用户的请求类型。OAuth 2 定义了下面的四种许可类型,它们试用于不同情形。

  • 授权码,常用于服务端;

  • 简化模式,常用于移动设备上;

  • 用户密码验证,常用于哪些比较信任的服务,比如团队内的项目;

  • 客户端验证,用于应用api访问;

授权码

目前大多数服务端的app授权都适用此方式,它会维护一个 client secret。应用通过客户端(比如浏览器)去获取API的授权码;

1.用户会收到一个授权的url,里面大概会带上一些基本信息,比如

client_id(应用id),redirect_uri(回调的地址),response_type(许可类型,类似response_type=code)等

2.用户授权应用,点击链接,用户会进入授权的界面,会需要用户确认接受活着拒绝该应用的授权请求。

3.如果用户点击了确认授权会掉转到回调的url,然后带上授权码。

http://yousite.com?code=AUTHORIZATION_CODE

4.应用获取access_token,应用会请求某个api获取用于访问接口的access_token。

5.应用会接受到接口的响应,获取到access_token,有些应用还会带上refresh_token。

当然拿到access_token后,应用就有权限去访问开放的一些接口,如果接口过期了,则需要重新授权。如果
返回了带有refresh_token,则通过refresh_token可以请求一个新的则需要重新获取新的access_token。

简化模式的授权许可

简化模式的授权更加适用于移动端的App以及Web应用,因为他们的安全性并不能够得到保证。同样的也是一个简单的流程,
只是access_token直接返回给客户端,这样access_token会直接暴露给用户,以及设备上的其他应用。除此之外,服务也不会对
应用的做唯一性表示验证,依赖回调的地址。

简化模式的授权不支持 refresh_token!

  1. 应用首先会通过一个链接去请求token;
  2. 用户点击链接后会跳转到授权的界面,询问用户许可;
  3. 用户许可后会直接带上access_token条会到原地址类似下面:
http://yoursite.com?access_token=ACCESS_TOKEN
  1. 客户端会将带过来的token保存起来,比如localstorage,cookie;
  2. 应用请求其他的api则都会带上这个access_token了。

用户密码验证的形式

这个形式就是直接将用户账户和密码拿到后去访问服务,然后拿到access_token,一般这种模式只用于自己的信任的服务,

比如自己家的产品或者桌面应用等。

应用在拿到用户的密码会请求一个地址带上这些数据

http://oauth.api.xxxx.com?username=USERNAME&password=PASSWORD&clientID=1232112

验证成功后,授权服务会返回一个access_token,那么现在这个应用就算授权成功。

客户端验证

客户端验证主要是提供一个方式让应用去访问自己的服务账号,去更新一些描述信息或者回调地址等。通过请求一个地址带上自己的信任然后去取得一个access_token.

refresh_token的使用

一般access_token都有个时间期限,过期了,访问其他服务则会受限制,这个时候有的会提供一个获取新token的接口,你只需带上refresh_token
以及客户端的其他信息。

扩展阅读

Thanks ! 图片设计来源于Digital Ocean

You Can Speak "Hi" to Me in Those Ways