如何使用claimsToAddOrOverride在Cognito中的IdToken声明中添加数组值

时间:2018-03-29 12:34:12

标签: json aws-lambda amazon-cognito

我正在使用Pre Token Generation来更新IdToken的声明。

我已成功使用单键更新声明:值对。 以下是该示例。

event["response"] = {"claimsOverrideDetails":{"claimsToAddOrOverride":{"scope": "test.debug"}}}

但是当我尝试在其中添加字符串数组时,它会给我内部服务器错误(来自AWS Cognito的响应)

前:

event["response"] = {"claimsOverrideDetails":{"claimsToAddOrOverride":{"scope": ["test1","test2]}}}
  

使用'测试'它正常工作。 lambda函数的选项。

如果我使用 groupsToOverride ,那么它会覆盖 cognito:groups 声明。

任何帮助?

2 个答案:

答案 0 :(得分:3)

我认为这一定是Cognito的一个错误,不幸的是,在解决之前,需要一种解决方法。

我知道这并不理想,但是我已经通过使用定界字符串解决了这个问题,当我收到令牌时,便将其解析为数组。

Lambda:

exports.handler = (event, context, callback) => {
    event.response = {
        "claimsOverrideDetails": {
            "claimsToAddOrOverride": {
                "scope": "test1|test2"
            }
        }
    };

    // Return to Amazon Cognito
    callback(null, event);
};

客户:

const token = jwt.decode(id_token);
const scopes = token.scope.split('|');

答案 1 :(得分:0)

名称 scope 在 JWT 中具有特殊含义,库希望这是一个以空格分隔的字符串形式的列表。所以作用域 test1 和 test2 将变成“test1 test2”。

我建议使用空格作为分隔符而不是任何其他格式。如果您更喜欢其他格式,只需为您的字段指定一个不同的名称 - 如组。

{
  "iss": "https://authorization-server.example.com/",
  "sub": " 5ba552d67",
  "aud":   "https://rs.example.com/",
  "exp": 1544645174,
  "client_id": "s6BhdRkqt3_",
  "scope": "openid profile reademail"
}