1. 令牌格式
字段 | 类型 | 必须 | 说明 | 应用令牌 | 用户令牌 |
---|---|---|---|---|---|
aud | str | 必须 | 接收jwt的一方 | APP的8字节M5D,创建的时候必须说明这个令牌从属的应用ID | 复制用户登录时持有的应用token的app_id |
iss | str | 必须 | 发布JWT的机构 | xdua.com | xdua.com |
iat | str | 必须 | 令牌签发UNIX时间戳 | 令牌签发UNIX时间戳 | 令牌签发UNIX时间戳 |
sub | str | 必须 | jwt所面向的用户 | AnoNymuS | 真实的用户8位ID |
exp | int | 必须 | 令牌的过期UTC时间戳 | 创造开始10年 | 创造开始15分钟 |
jti | str | 可选 | JWT ID用于标识该JWT,jwt的唯一身份标志,可以用来防重放 | ||
nbf | int | 可选 | 令牌有效时间点,早这个点JWT不会被接受和处理。 | 1分钟后 | 1秒后 |
typ | str | 自定 | 令牌种类 | D=数据/A=算法/L=登录/X=全能 | U |
clr | str | 自定 | 该令牌的颜色,也就是令牌有效的区域。取值R/G/B/X | 常量"X",不管是数据访问还是算法访问,都需要X色令牌。 | R=红店铺,此时zone=corp=shop,G=绿店铺,此时zone=corp,shop!=corp,B=蓝店铺,此时zone,corp,shop均不相等 |
ipm | str | 自定 | 可以请求的IP白名单 | 客户端的白名单,半角逗号(,)隔开,例如.../表示如果允许任意公网IP地址发起本令牌,也表示所有IP | |
dvm | str | 自定 | 可请求设备的白名单,半角逗号(,)隔开。格式为设备号类型连冒号,连设备ID。"*"表示允许任何设备 | 见注释 | 复制它原来的app_id的各字段 |
own | str | 自定 | 创建这个token的用户ID,用来追踪令牌来源,也是令牌计费账户 | 创建这个token的用户id | 复制自应用令牌的own字段。也是API扣费账户 |
tid | str | 自定 | 令牌在令牌表种的8位ID,用来尽快的索引令牌。 | 令牌的8位ID,在token表 | 令牌的8位ID,在token表 |
lgn | str | 自定 | 令牌在登录表中的8位ID,用来尽快的登录令牌。 | 常量"NullNull",表示不存在 | 令牌的8位ID,在login表 |
tag | str | 自定 | 令牌标签,用在一些特定的场合来区分不同的令牌,大小写字符串,最多8个字符。比如,APP的主令牌,次令牌就用这个字段区分 | 由生成时控制台填写定义 | 复制自对应的app令牌字段 |
sap | str | 自定 | 令牌能够访问的服务应用 ,Service App的缩写 | 要登陆到哪个平台 | 复制自应用令牌的app字段 |
api | str | 自定 | 令牌的API白名单 | 有些token只能发给某些API | 复制自应用令牌的api字段 |
bug | str | 自定 | 调试参数 | B:返回调试debug信息 E:返回event信息 F:返回fault信息 | |
zone | str | 自定 | 社区ID(8位M5D码) | XdUaXduA/AlgoAlgo/DaTaDaTa | 社区ID |
corp | str | 自定 | 企业ID(8位M5D码) | XdUaXduA/AlgoAlgo/DaTaDaTa | 企业ID |
shop | str | 自定 | 店铺ID(8位M5D码). | XdUaXduA/AlgoAlgo/DaTaDaTa。要求登录的店铺,只能在这个店铺登录。它也就是早期AddLogin接口里的shop_id字段。 | 登录后的用户令牌,这个地方就是登录后的店铺的shop_id,和登录令牌差不多。但是因为AddLogon的操作,可以使得这个字段和登录接口的shop_id不同 |
role | str | 自定 | 登录成功以后我要的角色,注意,是我登录成功要的。不是现在的角色。因为现在是AnoNymuS,角色名是Anonymus 。角色白名单,表示所有角色都可以。主要用于限制不同场合的登录。让这个令牌只能以普通会员的身份登录,尽管这个用户可能有多个角色。这个字段写在登录令牌里,一旦登录,产生的用户令牌会复制这个字段,从此只能用这几个身份进行工作。下述rule同理。这样的设计有问题吗?在注册令牌中,这个字段的意思,注册成功后,自动获取这个字段标记的角色,**注意,这个角色是zone直辖shop内的角色,否则查不到*类似于司机版,这种东西。 |
对于用户令牌,这个意思是我这个令牌仅有的权限。 | 复制自应用令牌同名字段 |
rule | str | 自定 | 权限白名单,登录之后我要行驶的权限,*表示所有权限,我登录之后想干什么就干什么,是在role的基础上的又一约束。null表示无值 | null | 复制自应用令牌同名字段 |
[!note] 发牌机构iss是常量xdua.com。 防重放串jti目前在应用令牌和用户令牌都是。应用令牌的role和rule字段是白名单,这个字段只对用户令牌有意义,在用户令牌的使用场景,访问控制会检查用户的角色和权限包不包含role和rule字段里的白名单。如果包含,就通过白名单检查。
[!note] 为什么要在令牌中设置null(全小写),而不是用空字符串,因为在网关解析的地方,不能填写空值。必须填写变量。
[!danger] 早期我们在令牌中设置了lgn字段,作为Login的缩写。后来我们取消掉了,原因如是,因为sub字段能表达token的登录用户是谁。用它也可以在login表查询当前登录状态。
JWT令牌还有其它的推荐字段,地球号目前不兼容,也不需要。
字段 | 类型 | 必须 | 说明 | 应用令牌 | 用户令牌 |
---|---|---|---|---|---|
acr | str | 可选 | Authentication Context Class Reference,表示一个认证上下文引用值,可以用来标识认证上下文类 | ||
amr | str | 可选 | Authentication Methods References,表示一组认证方法 | ||
azp | str | 可选 | Authorized party,结合aud使用。只有在被认证的一方和受众(aud)不一致时才使用此值,一般情况下很少使用 |
[!NOTE|style:flat|label:关于令牌role字段|iconVisibility:hidden] role字段是地球号登录灵活表达登录后效果的一种方式,它可以表达,尽管登录的人可能拥有好多角色,比方说root,god,shopa,但TA只想以某个角色子集进行登录,不想让暴露给客户端额外无意义的角色。例如,一个护理APP,用户登录时只想以护理或者院长的身份登录,并不像让护理APP或者TA还有本社区的超级管理员权限。此时就需要在role字段注明。
role举例 | 字段说明 |
---|---|
* | 以当前用户的最大权限集合登录,返回的roles是所有角色 |
None | 仅仅以None角色登录,返回的是None角色列表就是["None"]。 |
*,None | 如果有在role表达字串里,表达等效 |
None,god | 以None和God角色登录 |
God | 效果等同"God,None"。因为如果没有None,会自动补None |
2. 令牌样例
eyJhbGciOiJSUzI1NiIsImtpZCI6ImI1MGIxZWZmZGMwMzVlMjg2OWI2YzQ1ZjMzYmRmNWQ3In0.eyJpYXQiOjE1ODQ5NzUwNDMsIm5iZiI6MTU4NDk3NTA0MywiaXNzIjoieGR1YS5jb20iLCJleHAiOjE5MDAzMzUwNDMsImF1ZCI6IkJyb3dTZGtUIiwic3ViIjoiQW5vTnltdVMiLCJqdGkiOiIxMjM0NTY3OCIsImlwbSI6IioiLCJkdm0iOiIqIiwic2FwIjoiU3ZLZXJuZUwiLCJhcGkiOiJBZGRMb2dpbiIsImNsciI6IlgiLCJvd24iOiJEdDVtdnJ0VSIsInRpZCI6InhzQUZGNmpHIiwiYnVnIjoiREUiLCJsZ24iOiJOdWxsTnVsbCIsInR5cCI6IkwiLCJ0YWciOiJQcmltYXJ5Iiwiem9uZSI6IlhkVWFYZHVBIiwiY29ycCI6IlhkVWFYZHVBIiwic2hvcCI6IlhkVWFYZHVBIiwicm9sZSI6IioiLCJydWxlIjoiKiJ9.b_KQVug-D83hsfzHVoOvyJZUjjnWhr1UiRCLOBcUSFCLfh3ZoP5GE7m98s6H3QsDpYs20hFkFecj0xiyxzQKy5DOq9XbroXffDmBgg5y45WYnW3P8iqB2WQBtBwEU3VAWk_Vx6UwnGmpb_juu7KsFK33rWswFx3odbw7xe2iMdReywc6bYHf0P7s7kNYqYF_n-odiO6UsZd7yeNos8Hn7XtzE2igD7DhTbB0oxqEzVHoMtFcVAdstsLi3aAcJOK2Gp-XhWHSuiGqd9kTPmghk5cmIDcN7KOOZ6y1GQevM2Qc_7tfebP3Ev-bAZEPAyUA77zRrQMrpwJouejR_sNd3g
{
"iat":1584975043,
"nbf":1584975043,
"iss":"xdua.com",
"exp":1900335043,
"aud":"BrowSdkT",
"sub":"AnoNymuS",
"jti":"12345678",
"ipm":"*",
"dvm":"*",
"sap":"SvKerneL",
"api":"AddLogin",
"clr":"X",
"own":"Dt5mvrtU",
"tid":"xsAFF6jG",
"bug":"DE",
"lgn":"NullNull",
"typ":"L",
"tag":"Primary",
"zone":"XdUaXduA",
"corp":"XdUaXduA",
"shop":"XdUaXduA",
"role":"*",
"rule":"*"
}
字段 | 类型 | 值 | 必须 |
---|---|---|---|
aud | str | BrowSdkT | 这个令牌仅仅是给浏览器SDK测试客户端应用的 |
iss | str | xdua.com | 地球号签发 |
iat | str | 1584359676 | 创建时间 |
nbf | int | 1584359676 | 有效起始时间 |
exp | int | 1584359676 | 10年有效期 |
sub | str | AnoNymuS | 这个令牌只签发给匿名用户,用户ID是AnoNymuS |
jti | str | 12345678 | Nonce字串,无它用,就是填充常量12345678 |
typ | str | L | Login,这是个登录令牌 |
clr | str | X | 本令牌只能登录神社 |
ipm | str | * | 任何IP都可以用这个令牌 |
dvm | str | * | 任何设备都可以用这个令牌 |
own | str | Dt5mvrtU | 这个令牌是Dt5mvrtU 创建的,这个API的计费记在这个人头上 |
tid | str | 2cEzbCk2 | 本令牌在token表的id |
lgn | str | NullNull | 本令牌在login表的id,因为本令牌是登录令牌,所以lgn没有意义,这里填充NullNull |
tag | str | Primary | 无意义,随便填写 |
sap | str | SvKerneL | 这个登录令牌只能登录地球号的SvKerneL服务 |
api | str | AddLogin | 这个令牌只能访问SvKerneL服务的AddLogin接口 |
bug | str | DE | 要求服务器端返回Debug字段和event字段 |
zone | str | XdUaXduA | 本令牌仅仅能访问神社 |
corp | str | XdUaXduA | 本令牌仅仅能访问神社 |
shop | str | XdUaXduA | 本令牌仅仅能访问神社 |
role | str | * | 本登录成功后,要以登陆这的最大角色集合工作 |
rule | str | * | 本登录成功后,要以登录者的最大权限集合工作 |