AWS 亚马逊的鉴权方案
目录
基于OpenID Connect (OIDC) 开放标准实现了 ID, access, and refresh tokens。
重要:强烈建议所有 token 在你的 APP 上下文中保存和传输。
JWT,包含用户身份信息,1小时后过期。
{
"kid" : "1234example="
"alg" : "RS256",
}
kid: Key ID,暗示使用的密钥,用以匹配具体的密钥。
alg: Algorithm,代表密码算法,用以加密ID Token。RS126
表示RSA
+SHA-256
。应从 JWA(JSON Web Algorithm) 中取值。
{
"sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"aud": "xxxxxxxxxxxxexample",
"email_verified": true,
"token_use": "id",
"auth_time": 1500009400,
"iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
"cognito:username": "janedoe",
"exp": 1500013000,
"given_name": "Jane",
"iat": 1500009400,
"email": "janedoe@example.com"
}
这些 claims 可以自己定制(可规定自己定制的都带有某一前缀,如cognito:
),也可以从 OIDC Standard Claims 中取值。
当在你的APP之外使用 ID Token 的时候,必须总是验证签名。
如何验证?
- 是否符合 JWT 规范
- 验证签名
- 检验Claims:是否过期、aud是否正确、iss是否匹配、token_use是否正确
JWT,包含已经鉴权的用户claims,1小时后过期。
Header 与 ID Token 结构相同,但 kid 不同。
在使用前,必须验证该 JWT。
{
"kid" : "5678example="
"alg" : "RS256",
}
{
"sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"device_key": "us-west-2_"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"cognito:groups": [
"admin"
],
"token_use": "access",
"scope": "aws.cognito.signin.user.admin",
"auth_time": 1562190524,
"iss": "https://cognito-idp.us-west-2.amazonaws.com/us-west-2_example",
"exp": 1562194124,
"iat": 1562190524,
"jti": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"client_id": "57cbishk4j24pabc1234567890",
"username": "janedoe@example.com"
}
使用不同于 ID Token 的 key 加密。
用以重新获得 ID Token和 Access Token。
默认30天后过期。过期后必须重新登录获取。
剩余有效期应至少5分钟。
用户可以从当前登录的所有设备中退出,那么用户必须:
- 现有 Refresh Token 、Access Token 都用不了
- 用户必须重新鉴权以获取新 Token
APP 必须使用用户有效的、未过期的、未撤销的访问令牌来调用此GlobalSignOut方法。
参考文献: