你能使用用户池授权者和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
EXPERTE
gefragt vor 6 Monaten3 Aufrufe
1 Antwort
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
EXPERTE
beantwortet vor 6 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen