什么是oAuth
oAuth(Open Authorization)的协议为用户授权提供了一个安全的,开放而又简易的标准。
oAuth协议和以往的授权方式相比,它不会使第三方触及到用户的账户信息,如登陆用户名和密码。
oAuth是安全的。
oAuth协议特点:
- 简单:不管是oAuth服务提供者还是应用开发者,都很易于理解与使用。
- 安全:第三方不会设计用户账户信息。
- 开放:任何服务提供商都可以使用oAuth,任何软件开发商都可以使用oAuth
一个例子更好理解oAuth的适用场景
现有一个是图片在线缓存功能由A服务提供商提供 还有一个是打印图片功能由B服务提供商提供,当用户要使用B打印A上缓存的图片。
做法1:从A上下载图片,在上传到B上。
做法2:把用户在A上的用户名和密码给到B,B去用这个用户名和密码登陆A去下载图片。
这两个做法缺点:
- B服务提供商为了用户后续操作,会保存用户的登陆名和密码,这样很不安全。
- B服务拥有用户的登陆名和密码,就可以去A获取用户储存在A上的所有资料的权力,用户没法限制B服务提供商获得授权的范围和有效期。
- 用户只有修改密码,才能让B对A访问的失效。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
- 假如B程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。
oAuth的思路
OAuth在”B”与”A”之间,设置了一个授权层(authorization layer)。”B”不能直接登录”A”,只能登录授权层,以此将用户与B区分开来。”B”登录授权层所用的令牌(token),令牌与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。
“B”登录授权层以后,”A”根据令牌的权限范围和有效期,向”B”开放用户储存的资料。(用户是怎么设置权限的)
oAuth三个url参数(重要)
- Request Token URL: 获取未授权的Request Token服务地址;
- User Authorization URL: 获取用户授权的Request Token服务地址;
- Access Token URL: 用授权的Request Token换取Access Token的服务地址;
oAuth认证授权就三个步骤,三句话可以概括:
1. 获取未授权的Request Token
2. 获取用户授权的Request Token
3. 用授权的Request Token换取Access Token
对比可发现其实就是三个重要的url参数
OAuth 2.0的运行流程如下图,摘自RFC 6749
A:第三方向用户发起请求申请权限。
B:用户同意,授予第三方权限。、
C:第三方拿着用户授予的权限向服务提供方申请Access Token 令牌。
D:服务提供方检查权限,下发Access Token令牌。
E:第三方拿着Access token去服务提供方调取用户信息。
F:服务提供方效验 Access Token 信息正确无误后,返回用户信息给第三方。
这里面重要的在第二环节第三方怎么拿到用户的授权。
这里面有四种授权方式:
- 授权码模式(Authorization Code)(正统方式)(支持refresh token)
- 授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)
- Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)
- Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)
简单介绍一下Refresh token
由于Access Token 设置有效期,这个短期的有效期可以有效的避免Access Token泄露,但是在第三方那里就显得不那么方便,因为每次失效之后都要去用户那里进行请求,用户每过几天就要重新授权给第三方及其影响体验。那么就引入了Refresh token。