你能使用用户池授权者和API网关获取自定义声明吗?

0

【以下的问题经过翻译处理】 你能在API Gateway v2代理lambda中获取自定义声明吗?

我使用CDK创建了一个API Gateway配置作为授权器,如下所示:

this.authorizer = new HttpUserPoolAuthorizer(stack.config.apiAuthorizer, userPool, {
    userPoolClients: [ userPoolCLient ]
});

这很棒。然后在我的lambda函数中,我试图获取自定义声明,如下所示:

export function getAllCustomers(request: APIGatewayProxyEventV2WithJWTAuthorizer, context: Context): Promise<APIGatewayProxyResultV2<GetCustomersResponse>> {
    const claims = request.requestContext.authorizer.jwt.claims;

但是这是我得到的:

{
  "claims": {
    "auth_time": "1675018035",
    "client_id": "xxxxxx",
    "event_id": "031bcda9-f10d-4132-abc7-xxxx",
    "exp": "1675021635",
    "iat": "1675018035",
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-xxxxxx",
    "jti": "1a6cf3b9-f809-412a-bc68-xxxx",
    "origin_jti": "80bb0296-6acc-47f8-8963-e6a2d9f0a26c",
    "scope": "aws.cognito.signin.user.admin",
    "sub": "xxxxxx",
    "token_use": "access",
    "username": "xxxxxx"
  },
  "scopes": null
}

我本来期望它会向我传递所有声明,那我就可以得到给定的名字、电子邮件和我自己的自定义用户池属性。除了创建完全自定义的授权者之外,还有其他方法可以做到这一点吗?或者,原始令牌是否可用,并且我只能解码它?每次检索所有属性都需要使用子进行cognito调用,这样会很好。

更新:我想我弄清楚了是怎么回

profile picture
专家
已提问 5 个月前2 查看次数
1 回答
0

【以下的回答经过翻译处理】 我打算回答自己的问题,但我很想知道人们是否认为这是好事还是坏事。如果没有别的,这可能会作为一个例子,帮助其他遇到相同问题的人。

看起来,如果你有一个访问令牌,你总是可以调用 GetUser 来获取 ID。访问令牌包含一个发布者 URL,这一定是 CognitoIdenttityProviderClient 知道如何返回到正确的用户池。这似乎可以正常工作。我不清楚 GetUser 是否检查令牌的有效性,但我认为一定要这样做,因为它说访问令牌必须没有过期。但文档并没有明确说明这一点。(有人能够确认 GetUser 充分验证了访问令牌吗?似乎一定要这样。)

export function getAllCustomers(request: APIGatewayProxyEventV2WithJWTAuthorizer, context: Context): 
        Promise<APIGatewayProxyResultV2<GetCustomersResponse>> {

    /* 从 API 网关 v2 代理事件中获取授权头 */
    const authHeader = request.headers['authorization'];
    if (authHeader === undefined) {
        return Promise.resolve({
            body: "没有承载令牌",
            statusCode: http2.constants.HTTP_STATUS_FORBIDDEN
        })
    }

    /* 查看它是否以 Bearer 开头,以表明它是访问令牌 */
    if(!authHeader.startsWith("Bearer ")) {
        return Promise.resolve({
            body: "授权头无效",
            statusCode: http2.constants.HTTP_STATUS_FORBIDDEN
        })
    }

    const accessToken = authHeader.substring(7)
    const cc = new CognitoIdentityProviderClient({})
    const ccReq = new GetUserCommand({AccessToken: accessToken});

    return cc.send<GetUserCommandInput, GetUserCommandOutput>(ccReq)
        .then((result: GetUserCommandOutput) => {
           /* 现在我们有完整的 ID,可以做一些有用的事
profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则