可能对 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 网关中设置认知授权者之后也没有出现。
您期望的 lambda 请求上下文授权者属性来自使用 lambda 授权者。使用 Cognito 用户池授权方时,您可以从授权标头中获取令牌并使用 JWT 库对其进行解码,并访问令牌包含的任何属性。