元数据是什么(元数据是什么数据)
0. RFC6749还有哪些可以完善的? 0.1. 撤销Token
在上篇中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如何获得access_token,并未说明怎么来撤销一个access_token。关于这部分OAuth2单独定义了一个来解决撤销Token问题。
0.2. Token对Client的不透明问题
OAuth2提供的“access_token"是一个对Client不透明的字符串,尽管有"scope","expires_in"和"refresh_token"来辅助,但也是不完善的且分散的信息。还拿上一篇的小明来举例,“小明授权在线打印并且包邮的网站访问自己的QQ空间的相册”。双引号里面的这句话其中有4个重要的概念:
授权者小明:表示是小明授权,而不是隔壁老王。
被授权者在线打印并且包邮的网站:表示授权给指定的网站,而不是其他的比如1024.com之类的网站(你懂的。。。)。
小明自己的QQ空间:表示让被授权者访问自己的信息,而不是隔壁老王的信息,小明也没这权限来着,不然隔壁王婶夜不答应吧。。。
相册:表示你可以访问我的相册,而不是我的日志,我的其他信息。
那么如何得到获得上面提到的这些附加的信息呢?OAuth2又单独提供了一个来解决Token的描述信息不完整的问题。
1. OAuth2 Token 撤销(RFC7009 - OAuth2 Token Revocation)
简单来说,这个协议规定了一个Authorization server提供一个怎样的API来供Client撤销access_token或者refresh_token。
比如Client发起一个如下的请求:
POST /revoke HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
token=45ghiukldjahdnhzdauz&token_type_hint=refresh_token
其中各项含义如下:
/revoke:是Authorization Server需要提供的API地址,Client使用Post方式请求这个地址。
Content-Type: application/x-www-form-urlencoded:固定此格式。
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW:访问受保护资源的授权凭证。
token:必选,可以是access_token或者refresh_token的内容。
token_type_hint:可选,表示token的类型,值为”access_token“或者"refresh_token"。
如果撤销成功,则返回一个HTTP status code为200的响应就可以了。
2. OAuth2 Token 元数据(RFC7662 - OAuth2 Token Introspection)
简单的总结来说,这个规范是为OAuth2扩展了一个API接口(Introspection Endpoint),让第三方Client可以查询上面提到的那些信息(比如,access_token是否还有效,谁颁发的,颁发给谁的,scope又哪些等等的元数据信息)。
比如Client发起一个如下的请求:
POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483
token=2YotnFZFEjr1zCsicMWpAA&token_type_hint=access_token
看起来和上面的撤销Token的请求差不多,其中各项含义如下:
/introspect:是Authorization Server需要提供的API地址,Client使用Post方式请求这个地址。
Accept:application/json:表示Authorization Server需要返回一个JSON格式的数据。
Content-Type: application/x-www-form-urlencoded:固定此格式。
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW:访问受保护资源的授权凭证。
token:必选,可以是access_token或者refresh_token的内容。
token_type_hint:可选,表示token的类型,值为”access_token“或者"refresh_token"。
如果请求成功,则会返回如下的信息:
{
"active": true,
"client_id": "l238j323ds-23ij4",
"token_type":"access_token",
"username": "jdoe",
"scope": "read write dolphin",
"sub": "Z5O3upPC88QrAjx00dis",
"aud": "https://protected.example.net/resource",
"iss": "https://server.example.com/",
"exp": 1419356238,
"iat": 1419350238,
"nbf": 1419350238,
"jti": "abcdefg"
"extension_field": "twenty-seven"
}
JSON各项属性含义如下(其中有些信息是在JSON Web Token中定义的,参考链接有详细的介绍):
active:必须的。表示token是否还是有效的。
client_id:可选的。表示token所属的Client。比如上面的在线打印并且包邮的网站。
token_type:可选的。表示token的类型。对应传递的token_type_hint。
user_name:可选的。表示token的授权者的名字。比如上面的小明。
scope:可选的。和上篇中的可选参数scope对应,表示授权给Client访问的范围,比如是相册,而不是小明的日志以及其他受保护资源。
sub:可选的。token所属的资源拥有者的唯一标识,JWT定义的。也就是小明的唯一标识符。
aud:可选的。token颁发给谁的,JWT定义的。
iss:可选的。token的颁发者,JWT定义的。
exp:可选的。token的过期时间,JWT定义的。
iat:可选的。iss颁发token的时间,JWT定义的。
nbf:可选的。token不会在这个时间之前被使用,JWT定义的。
jti:可选的。token的唯一标识,JWT定义的。
extension_field:可以自己扩展相关其他属性。
其中大量的信息都是可选的信息,而且可以自己扩展需要的属性信息,从这些属性中就可以解决我们上面提到的access_token对于Client不透明的问题。
我们注意到其中有很多属于JWT定义的属性,那么这个JWT是什么东西?它解决了什么问题?
3. JSON Web Token (JWT)
简单总结来说,JWT是一个定义一种紧凑的,自描述的并且提供防篡改机制的传递数据的方式的标准协议。
我们先来看一个简单的示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Imxpbmlhbmh1aSJ9. hnOfZb95jFwQsYj3qlgFbUu1rKpfTE6AzgXZidEGGTk
就是这么一堆看起来像是乱码一样的字符串。JWT由3部分构成:header.payload.signature,每个部分由“.”来分割开来。
3.1. Header
header是一个有效的JSON,其中通常包含了两部分:token类型和加密算法。
{ "alg": "HS256", "typ": "JWT"}
对这个JSON采用编码后就是第1部分eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。
3.2. Payload
这一部分代表真正想要传递的数据,包含一组Claims,其中JWT预定义了一些Claim(这一节就用到一些JWT预定义的一些Cliam)后面会介绍。关于什么是Claim,可以参考文章末尾给的参考链接。
{ "sub": "1234567890", "name": "linianhui"}
对这个JSON采用编码后就是第2部分eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Imxpbmlhbmh1aSJ9。
3.3. Signature
这一部分是可选的,由于前面Header和Payload部分是明文的信息,所以这一部分的意义在于保障信息不被篡改用的,生成这部分的方式如下:
HMACSHA256( UrlEncode(header) + "." + UrlEncode(payload), secret)
使用header中指定的签名算法对“header.payload”部分进行签名,得到的第3部分hnOfZb95jFwQsYj3qlgFbUu1rKpfTE6AzgXZidEGGTk。然后组合成一个完整的JWT字符串,而接收方使用同样的签名算法来生成签名,来判断header和payload部分有没有被篡改锅,因为签名的密钥是只有通信双方知道的,所以可以保证这部分信息不被第三方所篡改。
3.4. JWT的一些Claims
JWT规范中预先定义了一些Cliam,但并不是必选的,常用的有:
iss(Issuer签发者)。
sub(subject签发给的受众,在Issuer范围内是唯一的)。
aud(Audience接收方)。
exp(Expiration Time过期时间)。
iat(Issued At签发时间)等等。
更完整的一些Claim列表参见:
如果上面这些仍无法满足自己的需要,则可以自定义一些来使用。
3.5. JWT 应用场景
由于其采用来进行编码,使得它可以安全的用在一些仅限ASCII的地方传递信息,比如URL的querystring中。
比如用户登陆后,可以把用户的一些属性信息(用户标识,是否是管理员,权限有哪些等等可以公开的信息)用JWT编码存储在cookie中,由于其自描述的性质,每次服务器读取到Cookie的时候就可以解析到当前用户对应的属性信息,而不必再次去查询数据库。如果Cookie中每次都发送浪费带宽,也可以用 Authorization: Bearer <jwttoken>的方式附加到Request上去。
4. OAuth2 & JWT
注意到我们在这一小节中,OAuth2返回Token的元数据的JSON,以及OAuth2中的access_token对Client是不透明的字符串这件事,我们可以把access_token的元数据信息用JWT来编码以下,作为access_token的字符串内容,这样是不是就可以使得它对Client是透明的了。
比如我之前遇到的问题,在我使用access_token的时候有没有过期我并不知道,其实需要借助辅助的“expires_in”来检查,还有其scope是哪些,也需要额外的去查询,再比如这个access_token管理的用户是谁,也需要额外的查询,有了JWT呢,可以把这些都打包进去,比如:
{
"sub":"linianhui",
"scope":"1419356238",
"exp":123456789,
}
然后生成一个这样的jwt字符串 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJsaW5pYW5odWkiLCJzY29wZSI6IjE0MTkzNTYyMzgiLCJleHAiOjEyMzQ1Njc4OX0.ASu85ohHMSOhnxbJSJI4OKLsPlbjPs7th0Xw5-b4l1A作为access_token的值,感觉一下子就方便了好多吧。
5. 总结
OAuth2在RFC6749中并未完整的提供一些问题的解决方案,而是附加了一些相关的RFC来解决这些问题,其实除了本文中提到的2个问题点之外,还有一些其他可以优化的地方存在,这些点在后续的OIDC的文章中再做介绍吧,感兴趣的可以看一看中关于OAuth2的另外一些相关扩展标准草案,这些标准也是OIDC所需要的一些可选支持。另外在一些场景下,使用JWT来使得OAuth2的提供自描述的Token还是一件很方便的事情的。
以上内容均是个人的一些理解,如果错误之处,欢迎指正!
6. 参考
JSON协议:
OAuth2 扩展协议:
OAuth相关扩展草案:
JWT相关协议族:
JWT官方站点:
Claims:
JWT注册的的一组Claims :
相关文章:
原文地址:http://www.cnblogs.com/linianhui/p/oauth2-extensions-protocol-and-json-web-token.html
相关文章
-
梦之蓝52度多少钱一瓶(海之蓝52度多少钱一瓶)详细阅读
中国糖酒联盟12月29日讯 涨,涨,涨,是2017年酒业的另一关键词。 无论是资本市场还是现货市场,无论是从高端到次高端品牌,还是从名酒名企到区域龙头...
2022-09-08 23062
-
在家上网做兼职(在家网上的兼职)详细阅读
我们中国人一般都羞于谈钱,觉得俗,觉得谈钱伤感情。自古至今,也一直都有“农本商末”“学而优则仕”的思想传统。已经开始做自媒体创业的朋友也会发现,咦,...
2022-09-08 22029
-
文案狗(文案狗app下载)详细阅读
IT狗,娱记狗,单身狗,各种狗,还有一只文案狗。文案狗是对现在从事文案行业人员的统称,白天看案例写文案,晚上看稿子改文案,每天都在重复着一件事情就是写...
2022-09-08 21250
-
民盟党(民盟党是什么政治面貌)详细阅读
今天是3月15日,“打假日”!一大早,对着电脑发呆的小编,想起了统战部的王二毛。有一天,王二毛吃完饭遛弯遇见隔壁王阿姨,王阿姨说:“哟这不是二毛嘛,毕...
2022-09-08 17654
-
退货率怎么计算(抖音退货率怎么计算)详细阅读
不到十年,众多快递公司经过残酷的优胜劣汰,佼佼者已然脱颖而出。2016年5月23日,鼎泰新材(002352.SZ)披露了“重大资产重组预案”,宣布将按...
2022-09-08 17223
-
群主怎么写群规(群主怎么写群规范文)详细阅读
微信群可以把有共同兴趣爱好或目标的人组成一个圈子,并且能快速实现组员之间的交流、互动,在共同分享的前提下很容易形成合作。而对于银行人来说,针对年轻客群...
2022-09-08 16792
-
合肥市属于哪个省(合肥市属于哪个省的)详细阅读
注:本文数据源于《安徽统计局·安徽统计年鉴2016》,以各市建成区面积排名为准。图片源于视觉中国、zol,感谢视觉中国所有原创摄影!(学术交流,非商业...
2022-09-08 705
-
app营销(app营销需要哪些营销策略)详细阅读
营销策略中的内容营销已经被加冕为王。对于创业者和创新企业来说,SEM(搜索引擎营销)、粉丝经济、公关等等手段尚不可形成规模,现阶段唯一能做好的,就是以...
2022-09-08 833
发表评论