首页 > 解决方案 > 为什么在 API Gateway 中使用 Authorizers 时只有令牌 id 成功而不是访问令牌?

问题描述

我有一个 lambda,它为我的用户池中的现有用户创建令牌,但是当我要验证访问令牌时返回错误 401,当我尝试使用 ID 令牌时它返回 200。

function asyncAuthenticateUser(cognitoUser, cognitoAuthenticationDetails) {
    return new Promise(function(resolve, reject) {
        cognitoUser.authenticateUser(cognitoAuthenticationDetails, {
            onSuccess: resolve,
            onFailure: reject
        });
    });
}

 var authenticationData = {
                Username: name,
                Password: password,
            };
            var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
            var poolData = {
                UserPoolId: UserPoolId,
                ClientId: ClientId
            };
            var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
            var userData = {
                Username: name,
                Pool: userPool
            };
            var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
            try {
                let session = await asyncAuthenticateUser(cognitoUser, authenticationDetails);
                cognitoJWT.session = session;
                console.log(session.getIdToken());
                cognitoJWT.jwtAccess = session.getAccessToken().getJwtToken();
                cognitoJWT.jwtId = session.getIdToken().getJwtToken();
                cognitoJWT.jwtRefresh = session.getRefreshToken().getToken();
                cognitoJWT.jwtPayloads = {
                jwtAccess: session.getAccessToken().decodePayload(),
                jwtId: session.getIdToken().decodePayload(),
                };
                callback(null, cognitoJWT);
            } catch (err){callback(err,null); }

我的 Lambda 输出是:

{
"StatusCode": 200,
 "StatusMessage": {
 "jwtAccess": "<<jwtAccess>>",
 "jwtRefresh":"<<jwtRefresh>>",
 "jwtId":<<jwtId>>
 }
}

但是当我尝试在 API 网关上进行验证时,我得到了这个输出。

输出 API 网关 jwtAccess


如果我尝试使用 jwtID,它会显示用户信息。 输出 API 网关 jwtId

标签: aws-lambdajwtaws-api-gatewayamazon-cognito

解决方案


使用错误的令牌进行验证。API Gateway 实际上使用 de "idToken" 进行验证,而不是 "accessToken"。所以当你要测试token时,你必须使用第一个。


推荐阅读