重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
OAuth 2.0 授权框架能够是第三方应用获取应用被保护的服务资源,它是一种授权互联网标准,由IETF(Internet Engineering Task Force)管理发布。
本文主要参考材料为
RFC 6749
接下来以一个生活中的例子来简单解释OAuth3的应用场景。
我家所在的小区门禁系统升级,用户可以下载物业的手机APP,注册用户并通过物业审核之后,就可以使用APP中的“蓝牙开门”功能开启大门。
有一次,朋友给我打电话说要到我家拜访,通过访客邀请功能填写基本的信息,然后发送一个微信小程序链接给朋友
朋友点开小程序,点击一键开门就可以进入小区,当天有效并且限制使用8次
整个过程就相当于一次授权:
小区可以理解成被保护的资源,我本人拥有APP的用户和密码,登陆后可以使用一键开门进入小区。
朋友打电话给我申请授权,我通过APP发放一个凭证(微信小程序),朋友可以在凭证有效期内进入小区。
授权机制可以方便的允许第三方(朋友)访问被保护的资源(小区),同时不需要提供用户密码。
(A) 客户端(Client)向资源拥有者(Resource Owner)申请授权,资源拥有者(Resource Owner)可以直接授权,但最好是通过Autherization进行授权
(B)客户端(Client)获得授权的允许凭据(Authorization Grant),在OAuth3.0中该凭据的获取有四种类型,授权码、隐藏式、用户密码和客户端凭证
(C)客户端(Client)使用授权凭据向授权服务器(Authorization Server)申请访问凭证(Access Token)
(D)认证服务器(Authorization Server)验证申请凭据(Authorization Grant),验证通过后颁发访问凭证(Access Token)
(E)客户端(Client)使用访问凭证(Access Token)访问资源服务器(Resource Server)
(F)资源服务器(Resource Server)验证访问凭证(Access Token),验证通过后对客户端(Client)请求进行处理并返回结果
刷新凭证(Refresh Token)是由认证服务器(Authorization Server)颁发给客户端(Client),用于在当前凭证失效或者过期时,重新获取一个新的访问凭证(Access Token)。但颁发刷新凭证(Refresh Token)对于认证服务器(Authorization Server)是可选择的功能,如果支持,刷新凭证(Refresh Token)会与访问凭证(Access Token)一同颁发
(A)客户端(Client)使用授权凭据(Authorization Grant)请求访问凭证(Access Tonken)
(B)认证服务器(Authorization Server)验证凭据通过后,颁发访问凭证(Access Token)和刷新凭证(Refresh Token)
(C)客户端(Client)使用访问凭证(Access Token)访问资源服务器(Resource Server)
(D)资源服务器(Resource Server)验证访问凭证(Access Token),验证通过对请求进行处理
(E)步骤(C)、(D)会不断重复,直到访问凭证(Access Token)过期,此时流程会跳转至(G)
(F)由于凭证过期,资源服务器会返回凭证过期的错误
(G)客户端(Client)使用刷新凭证(Refresh Token)请求新的访问凭证(Access Token)
(H)认证服务器验证刷新凭证,验证通过,办法新的访问凭证和刷新凭证
(A)客户端(Client)使浏览器(User-Agent)跳转至认证服务器(Authorization Server)的认证接口,请求信息包含客户端标识、请求范围、跳转URI(跳转至客户端,用来提取授权码)
(B)认证服务器(Authorization Server)验证资源所有者(Resource Owner),通常就是用户填写用户名密码并确认是否授权
(C)认证服务器(Authorization Server)如果验证通过,则会返回给浏览器(User-Agent)步骤(A)中发送的跳转URI,跳转至客户端(Client),跳转URI中同时会携带授权码(Authorization Code)
(D)客户端(Client)使用授权码(Authorization Server)向认证服务器(Authorization Server)请求访问凭证(Access Token),同时还会携带跳转URI用于客户端提取访问凭证(Access Token)
(E)认证服务器(Authorization Server)验证授权码(Authorization Server),验证通过后颁发访问凭证(Access Token)
请求包含以下参数:
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
响应包含以下参数:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
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
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)客户端(Client)通过浏览器(User-Agent)跳转至认证服务器(Authorization),请求中包含客户端标识和跳转URI
(B)用户(Resource Owner)填写用户密码,认证服务器(Authorization)对其进行认证
(C)认证服务器(Authorization)认证通过后,返回之前传入的跳转URI至浏览器,跳转URI中以锚点(#)的方式包含访问凭证(Access Token)
(D)浏览器(User-Agent)跳转至URI指向的客户端的Web服务器,浏览器(User-Agent)保留锚点之后的信息
(E)客户端Web服务器返回一个web页面(其中包含嵌入的脚本),web页面能够提取锚点中的信息,并发送完整的URI至客户端
(F)浏览器(User-Agent)执行Web页面中的脚本
(G)浏览器(User-Agent)发送访问凭证(Access Token)至客户端(Client)
参数包括:
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
参数包括:
HTTP/1.1 302 Found
Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
&state=xyz&token_type=example&expires_in=3600
(A)资源所有者(Resource Owner)提供给客户端(Client)用户名和密码
(B)客户端(Client)使用用户名/密码,向认证服务器(Authorization Server)请求访问凭证(Access Token)
(C)证服务器(Authorization Server)验证用户名/密码,验证通过后颁发访问凭证(Access Token)
参数包括:
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
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)客户端(Client)向认证服务器(Authorization Server)请求访问凭证(Access Token)
(B)认证服务器(Authorization Server)验证客户端(Client),如果验证通过则颁发访问凭证(Access Token)
参数:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
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,
"example_parameter":"example_value"
}