Ashing's Blog

想学的太多 懂得的太少

0%

WEB认证授权4—OAuth、SSO、OpenID.md

0x01 OAuth

  • OAuth(开放授权)是一个开放的授权标准,允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

1 原理

  • 思路:OAuth在”客户端”与”服务提供商”之间,设置了一个授权层(authorization layer)。”客户端”登录授权层,在授权层拿到Token(Token携带权限范围和时间等),再去访问目标网站

    • OAuth允许用户提供一个令牌(Token),而不是用户名和密码来访问他们存放在特定服务提供者的数据。
    • 每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。
    • 这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容

2 四种授权模式

1
2
3
4
5
6
7
8
9
10
11
12
授权码模式(authorization code):
功能最完整、流程最严密的授权模式。也是最常用的授权模式。其通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

简化模式(implicit):
不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

密码模式(resource owner password credentials):
用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

客户端模式(client credentials):
指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

3 安全性问题:关注四个参数

1
2
3
4
5
6
7
redirect_url:回调域名

client:必须与域名绑定

state:防止CSRF

scope:权限范围

0x02 SSO:单点登录

  • 在多个应用系统中,用户只需登陆一次,就可以访问所有相互信任的应用。
    • 通常公司内部会有非常多的工具平台供大家使用,比如人力资源,代码管理,日志监控,预算申请等等。如果每一个平台都实现自己的用户体系的话无疑是巨大的浪费,所以公司内部会有一套公用的用户体系,用户只要登陆之后,就能够访问所有的系统。
  • SSO 是一类解决方案的统称,而在具体的实施方面,有两种策略可供选择:
    • SAML 2.0
    • OAuth 2.0

0x03 OpenID

  • 某些站点看到允许以 OpenID 的方式登陆,其实也就是以 Facebook 账号或者 Google 账号登陆站点
  • 这听上去似乎和 OAuth 很像。但本质上来说它们是截然不同用户的两个东西:
    • OpenID 只用于身份认证(Authentication),允许你以同一个账户在多个网站登陆。它仅仅是为你的合法身份背书,当你以 Facebook 账号登陆某个站点之后,该站点无权访问你的在 Facebook 上的数据
    • OAuth 用于授权(Authorisation),允许被授权方访问授权方的用户数据