OpenID Connect

User Managed Access (UMA)

资源拥有者向授权服务器进行身份认证,可以自由选择: 用户名/密码、加密证书、安全令牌、联合单点登录或其它方式

授权服务器可以保存授权决策,后续可以跳过授权环节,沿用前一次的授权决策

也可以通过客户端白名单或者黑名单的内部策略来否决用户的决策

令牌内省

记忆授权决策

授权码许可类型

隐式许可类型

客户端凭据许可类型

授权服务器和资源服务共享令牌数据库是一种简单可行的机制,但是如果授权服务器要对多个资源服务进行保护,这种共享就不合适,可以使用:结构化令牌和令牌内省

结构化令牌 - JWT

签名的 JWT

JWT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// JWT 头部,描述令牌剩余部分的信息
{
"typ": "JWT", // 表明令牌的第二部分(载荷)的类型
"alg": "none" // none 表示未签名的令牌
}

// 载荷, JWT 的载荷可以是任意的 JSON 对象
{
"sub": "1234567890", // 令牌主体, 令牌是关于谁的,一般设为资源拥有者的唯一标识
"name": "John Doe", // 特定于当前应用的新增字段,用户名称
"admin": true // 特定于当前应用的新增字段,是否为管理员
}

// 载荷, JWT 提供的一些可选的声明,可以为特定的应用新增字段
{
"iss": "", // 令牌颁发者,令牌的创建者,一般设为授权服务器的 URL
"sub": "", // 令牌主体, 令牌是关于谁的,一般设为资源拥有者的唯一标识
"aud": "", // 令牌的受众,令牌的接收者,包含受保护资源的 URI 或者能够接受该令牌的受保护资源,可以是字符串数组
"exp": 123456, // 令牌的过期时间戳,令牌什么时候过期,自 UNIX 纪元以来的秒数
"nbf": 123456, // 令牌的生效时间戳,令牌从什么时候生效,自 UNIX 纪元以来的秒数
"iat": 123456, // 令牌颁发的时间戳,令牌何时被创建,自 UNIX 纪元以来的秒数
"jti": "" // 令牌的唯一标识符。令牌颁发者创建的每一个令牌中唯一,密码随机值,这个值相当于向结构化令牌中加入了一个攻击者无法获得的随机熵组件,有利于防止令牌猜测攻击和重放攻击
}

通过 JOSE 库得到最终代签名的令牌

1
2
3
4
5
6
7
8
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6ImF1dGhzZXJ2ZXIifQ.eyJpc3MiOiJodH
RwOi8vbG9jYWxob3N0OjkwMDEvIiwic3ViIjoiOVhFMy1KSTM0LTAwMTMyQSIsImF1ZCI6Imh0d
HA6Ly9sb2NhbGhvc3Q6OTAwMi8iLCJpYXQiOjE0NjcyNTE5NjksImV4cCI6MTQ2NzI1MjI2OSwi
anRpIjoidURYMWNwVnYifQ.nK-tYidfd6IHW8iwJ1ZHcPPnbDdbjnveunKrpOihEb0JD5wfjXoY
jpToXKfaSFPdpgbhy4ocnRAfKfX6tQfJuFQpZpKmtFG8OVtWpiOYlH4Ecoh3soSkaQyIy4L6p8o
3gmgl9iyjLQj4B7Anfe6rwQlIQi79WTQwE9bd3tgqic5cPBFtPLqRJQluvjZerkSdUo7Kt8XdyG
yfTAiyrsWoD1H0WGJm6IodTmSUOH7L08k-mGhUHmSkOgwGddrxLwLcMWWQ6ohmXaVv_Vf-9yTC2
STHOKuuUm2w_cRE1sF7JryiO7aFRa8JGEoUff2moaEuLG88weOT_S2EQBhYB0vQ8A