An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.html
OAuth是Open Authorization(开放受权)的缩写,容许用户受权给第三方应用访问服务提供商所提供的用户资源,而且保证受权是安全的。web
官网地址json
四种角色:浏览器
两种实体:安全
(A) 用户打开客户端,客户端请求用户受权服务器
(B) 用户赞成受权给客户端app
(C) 客户端使用获取的受权,向认证服务器请求令牌url
(D) 认证服务器对客户端进行认证,并验证受权,确认有效后发放令牌给客户端.net
(E) 客户端使用令牌,向资源服务器请求资源3d
(F) 资源服务器验证令牌,确认有效后处理请求
客户端必须获取用户的受权,才可以获取令牌。OAuth定义了四种获取受权的方式:
是功能最齐全、流程最严谨,也是最经常使用的受权模式。
(A) 用户经过用户代理访问客户端,客户端将其重定向到认证服务器
实例:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 Host: server.example.com
(B) 用户选择是否受权给客户端
(C) 若是用户受权,认证服务器将用户重定向到客户端事先指定的URI,并附加一个受权码
实例:
HTTP/1.1 302 Found Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA &state=xyz
(D) 客户端使用受权码和重定向URI,向认证服务器申请令牌
实例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
(E) 认证服务器验证受权码和URI,确认无误后,向客户端发放令牌
实例:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" }
不经过第三方应用的服务器,直接在浏览器中进行,不须要使用受权码。
(A) 用户经过用户代理访问客户端,客户端将其重定向到认证服务器
实例:
GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 Host: server.example.com
(B) 用户选择是否受权给客户端
(C) 若是用户受权,认证服务器将用户重定向到客户端事先指定的URI,并在URI的Hash部分包含访问令牌
实例:
HTTP/1.1 302 Found Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA &state=xyz&token_type=example&expires_in=3600
(D) 浏览器向资源服务器发送请求,但不包含Hash值
(E) 资源服务器返回一个网页,包含获取Hash值中令牌的代码
(F) 浏览器执行脚本,获取令牌
(G) 浏览器将令牌发送给客户端
用户必须向客户端提供用户名和密码,存在较大的风险。一般只有在认证服务器没法经过其余方式进行受权时,才会考虑使用此种模式。
(A) 用户向客户端提供用户名和密码凭证
(B) 客户端将用户名和密码凭证发送给认证服务器,并请求令牌
实例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=password&username=johndoe&password=A3ddj3w
(C) 认证服务器确认无误后,向客户端发放令牌
由客户端直接向服务提供商进行认证,其实并不存在受权问题。
(A) 客户端向认证服务器提供身份凭证,并请求令牌
实例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=client_credentials
(B) 认证服务器确认无误后,向客户端发放令牌
若是用户访问的时候,客户端所获取的访问令牌已通过期,则须要使用刷新令牌从新申请新的访问令牌。
客户端发送的HTTP请求,包括如下参数:
实例:
POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
参考文章:
阮一峰:理解OAuth 2.0