目录

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 的时候,必须总是验证签名。

如何验证?

  1. 是否符合 JWT 规范
  2. 验证签名
  3. 检验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方法。


参考文献:

AWS: Using Tokens with User Pools

OpenID Connect (OIDC) specification