Cognito“Authorizer”元素未出现在通过 API 网关触发的 Lambda 中的 RequestContext 中

问题描述 投票:0回答:1

可能对 AWS/Amplify 方面缺乏经验:我有一个使用 Amplify 构建的应用程序,其中我有一个使用 Cognito 控制的用户群。在我的 Cognito 用户池中,我创建了一个自定义属性,我想将其传递给我的 API 以在自定义逻辑中使用。我可以在前端访问该自定义属性,但出于安全考虑,我不想在那里公开它。

在我的应用程序中,我正在 API 网关中调用我的资源:

let restCall = post({
        apiName: MY_API_NAME,
        path: "/MY_PATH",
        options: {body : parameters},
        headers: {"Authorization": "user_ID_Token"}
    });

    const {body} = await restCall.response;

我正在使用我的 Cognito 池作为该资源的授权者。 “Authorization”是我根据本指南定义的身份验证标头,“user_ID_Token”是我在调用“fetchAuthSession().tokens.idToken”时获得的属性,我(相信)正在使用它来授权调用。

然后调用通过此请求触发的我的 lambda

在其中,我有以下代码用于注销请求上下文:

app.post('/MY_PATH', async function(req, res) {

console.log(`requestContext ${JSON.stringify(req.apiGateway)}`);
console.log(`requestContext ${JSON.stringify(req.apiGateway.event.requestContext)}`);

从我看到的其他资源中,我希望“req.apiGateway.event.requestContext”包含一个“authorizer”对象,其下是一个“claims”对象,其中包含我的用户的详细信息,包括属性。我知道需要一些步骤才能获取我想要的特定自定义属性,但我的问题是首先没有授权者对象!以下是该 lmabda 最近登录 cloudwatch 的摘录

"requestContext": {
            "resourceId": "xxx",
            "resourcePath": "/MY_PATH",
            "httpMethod": "POST",
            "extendedRequestId": "xxx=",
            "requestTime": "25/Jun/2024:14:54:00 +0000",
            "path": "/dev/MY_PATH",
            "accountId": "xxx",
            "protocol": "HTTP/1.1",
            "stage": "dev",
            "domainPrefix": "xxx",
            "requestTimeEpoch": 1719327240217,
            "requestId": "xx",
            "identity": {
                "cognitoIdentityPoolId": null,
                "accountId": null,
                "cognitoIdentityId": null,
                "caller": null,
                "sourceIp": "51.198.135.75",
                "principalOrgId": null,
                "accessKey": null,
                "cognitoAuthenticationType": null,
                "cognitoAuthenticationProvider": null,
                "userArn": null,
                "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
                "user": null
            },
            "domainName": "xo92e4470h.execute-api.eu-north-1.amazonaws.com",
            "deploymentId": "sa27pp",
            "apiId": "xo92e4470h"
        },

我注意到 cognitoIdentityPoolId 为空,但我不确定其相关性。

任何人都可以阐明我在向正在调用的 API 公开调用用户的属性时缺少什么吗?

我希望在 lambda requestContext 日志中获得一个“授权者”对象,但即使在 API 网关中设置认知授权者之后也没有出现。

node.js aws-lambda aws-api-gateway amazon-cognito aws-amplify
1个回答
0
投票

您期望的 lambda 请求上下文授权者属性来自使用 lambda 授权者。使用 Cognito 用户池授权方时,您可以从授权标头中获取令牌并使用 JWT 库对其进行解码,并访问令牌包含的任何属性。

© www.soinside.com 2019 - 2024. All rights reserved.