大背景

为何须要OAuth许可呢?

最众所周知的应用领域情景是服务器端登入了, 他们合作开发了两个中文网站期望使用者能QQ登入, 但是不是能领到使用者的 QQ 重要信息呢? 使用者将 账号公钥说他们总之能, 但这种有如下表所示安全隐患:

  • 他们领到了使用者的公钥, 这种很不安全可靠. 所以任一两个应用领域被黑, 大部份有关公交站点均受负面影响
  • QQ 须要全力支持公钥登入, 但纯粹公钥登入并不安全可靠. 因而从而负面影响 QQ 的安全可靠难题
  • 他们领到公钥后, 就相等于保有了使用者的大部份重要信息, 这种难以展开职权管制可能将而已期望许可使用者名和肖像, 但连着挚友条目一同交待进来了
  • 使用者除非修正公钥, 大部份以后许可过的应用领域全数失灵

如前所述以内其原因, 就须要有这种两套监督机制:

  • 不如前所述公钥的许可
  • 许可存在时间管制, 并且随时能收回职权
  • 收回单个应用领域的职权, 不会对其他已许可的应用领域造成任何负面影响
  • 能仅授予个别职权, 而不是大部份

没错,OAuth是为了解决这个难题而提出来的.

介绍

OAuth是什么呢? 在RFC 文档中是这种介绍的.

OAuth provides a method for clients to access server resources on behalf of a resource owner (such as a different client or an end- user). It also provides a process for end-users to authorize third- party access to their server resources without sharing their credentials (typically, a username and password pair), using user- agent redirections.

写的比较官方哈, 简单说, 是许可他人以保有临时访问资源的职权.

那么,OAuth1.0是如何实现这种的监督机制呢?

实现

在介绍其实现以后, 须要先来了解OAuth中的几个概念.

  • 角色Consumer 消费者, 既须要访问资源的应用领域ServiceProvider 服务提供者, 既提供资源的服务器User 使用者

依旧使用他们上面的例子, 他们的网志中文网站须要接入 QQ 登入. 在这里, 网志中文网站是其中的Consumer, 而 QQ 服务器是ServiceProvider了. 为了方便立即, 下面均称为网志中文网站QQ服务器. 他们获取许可的流程大致如下表所示图:

qq博客注册(qq博客登录平台)-第1张

对其中的各个流程展开介绍

流程

在请求以后, 网志中文网站须要到 QQ 服务器 展开注册登记, 并获得如下表所示标识:

  • consumer_key: 中文网站标识符
  • consumer_secret: 中文网站使用的私钥

1. 获取 request_token

中文网站向QQ 服务器申请两个临时凭据, 用来在本次许可过程中展开校验.

携带参数

  • oauth_consumer_key
  • oauth_signature_method: 签名使用的生成方法
  • oauth_signature: 本次请求的签名, 使用consumer_secret生成
  • oauth_timestamp 时间戳, 用于对本次请求展开校验
  • oauth_callback 回调链接, 用于在使用者许可后回调通知消费者
  • oauth_nonce 随机字符串此参数用来防止重放攻击, 即别人领到请求链接再次请求因而, 服务提供者会对其展开验证是否处理过

返回数据

  • request_token: 此 token 仅用作后面许可中校验使用, 以及对本次许可展开标识
  • request_secret: 用于本次许可的后续请求展开加密, 使用在第5步

2. 重定向到服务器许可页面

将页面重定向到 QQ 服务器 的许可页面.

携带参数

  • request_token: 用来向 QQ 服务器标识本次许可

3. 使用者在 QQ 服务器完成许可操作

使用者在 QQ 服务器的许可页面展开登入并许可

4. 回调函数通知许可成功

使用者许可成功后, QQ 服务器将链接重定向到 第一步指定的 回调链接. 并在回调链接上附带结果:

  • request_token: 用来对本次许可展开标识. 毕竟网志中文网站收到回调时, 须要知道是哪个使用者许可成功了.
  • verifier: 在下一步获取 access_token 中检验使用. 具体作用在下一步说明.

5. 许可成功后获取 access_token + access_secret

此时使用者已经同意了职权的授予, 网志中文网站能到 QQ 服务器获取使用者的许可码了.

返回数据

  • access_token
  • access_token_secret

使用者后续就使用这两个许可重要信息到 QQ 服务器请求资源.

access_token_secret作用

这里有个小疑问, 既然有了access_token, 又为何须要access_token_secret呢?

因为访问数据使用HTTP协议, 对数据的传输过程没有安全可靠保障. 在后续访问资源时, 若仅使用consumer_secret对请求展开签名, 若consumer_secret泄露了, 那么攻击者只要获得使用者的access_token就保有了其职权. 而access_token又须要在访问是携带在参数中对职权展开标识. 故而十分危险.

在生成签名时, 额外加上access_token_secret展开签名, 而access_token_secret不会在后续访问中传递, 每个使用者又都是不同的, 因而即使consumer_secret泄露了, 攻击者也难以获得大部份使用者的职权.

携带参数

  • consumer_key
  • request_token
  • signature_method
  • timestamp
  • nonce
  • verifier
  • signature

verifier作用

那么, 这里的oauth_verifier有必要么? 其实它是为了防止 session固话攻击, 感兴趣的能搜索"OAuth Session Fixation Attack"查看具体内容. 这里简单介绍一下.

假设, 有两个攻击者监控了你的网络请求, 因为使用了HTTP协议, 明文重要信息也没什么秘密. 那么攻击者就能在第一步时获得本次许可的request_token. 同时攻击者又通过暴力破解或其他方法, 获得了consumer_secret.

此时, 若没有verifier参数, 本次请求的大部份参数攻击者均能构造. 若攻击者频繁访问本次请求, 又恰好在使用者许可完成和中文网站回调的间隙发起了合法访问, 就会成功获得使用者的access_token.

通过添加随机的verifier能使得本次请求不可预测.

难题

对于OAuth1.0实现的一些难题:

  • 使用了HTTP协议, 安全可靠性较低
  • 使用HTTP协议, 没有对服务提供者的真实性展开校验
  • 对非web应用领域(如安卓)全力支持很不友好. (也有通过 PIN 码实现的, 这里不展开介绍了)
  • 签名过程复杂. 须要同时使用consumer_secret+access_token_secret展开签名. (也是因为使用HTTP协议)

这些难题在OAuth2.0得到了解决, 详情查看下一篇文章: OAuth2.0介绍