CognitoIdentityCredentials 不提供访问权限

App*_*ins 3 amazon-web-services amazon-cognito

我不确定我是否正确理解了该过程,但我正在使用 Cognito 用户池并进行身份验证。我按预期收到了我的代币。我试图根据文档调用 CognitoIdentityCredentials作为我的 onSuccess 身份验证流程的一部分。

AWS.config.update({
    credentials: new AWS.CognitoIdentityCredentials({
        IdentityPoolId: IdentityPoolId,
    }),
    region: 'us-east-1'
});
Run Code Online (Sandbox Code Playgroud)

我已将 IAM 角色分配给我的 Cognito 身份池,并且一切看起来都已正确配置。但是,我没有收到任何 AWS 凭证。

文档指出:

默认情况下,此提供商使用 AWS.CognitoIdentity.getCredentialsForIdentity() 服务操作获取凭证,该操作需要 IdentityId 或 IdentityPoolId(Amazon Cognito 身份池 ID),用于调用 AWS.CognitoIdentity.getId() 来获取 IdentityId 。

我是否需要手动调用 AWS.CognitoIdentity.getId() 来获取 AWS 凭证?

Wil*_*ena 5

使用适用于 JavaScript v3 的 aws-sdk,我最终能够使用 Cognito 用户池授权程序(jwtToken)通过 API 网关调用的 JavaScript Lambda 函数中的以下代码,从 Cognito 用户的身份 jwtToken 获取 Cognito 用户的凭证IdentityId被传递到Authorization请求的标头中):

const IDENTITY_POOL_ID = "us-west-2:7y812k8a-1w26-8dk4-84iw-2kdi849sku72"
const USER_POOL_ID = "cognito-idp.us-west-2.amazonaws.com/us-west-2_an976DxVk"
const { CognitoIdentityClient } = require("@aws-sdk/client-cognito-identity");
const { fromCognitoIdentityPool } = require("@aws-sdk/credential-provider-cognito-identity");

exports.handler = async (event,context) => {
        const cognitoidentity = new CognitoIdentityClient({
            credentials:  fromCognitoIdentityPool({
                client: new CognitoIdentityClient(),
                identityPoolId: IDENTITY_POOL_ID,
                  logins: {
                      [USER_POOL_ID]:event.headers.Authorization
                  }
            }),
        });

        var credentials = await cognitoidentity.config.credentials()
        console.log(credentials)
        // {
        //    identityId: 'us-west-2:d393294b-ff23-43t6-d8s5-59876321457d',
        //    accessKeyId: 'ALALA2RZ7KTS7STD3VXLM',
        //    secretAccessKey: '/AldkSdt67saAddb6vddRIrs32adQCAo99XM6',
        //    sessionToken: 'IQoJb3JpZ2luX2VjEJj//////////...', // sessionToken cut for brevity 
        //    expiration: 2022-07-17T08:58:10.000Z
        //  }

        var identity_ID =  credentials.identityId
        console.log(identity_ID)

        const response = {
            statusCode: 200,
            headers: {
                "Access-Control-Allow-Headers": "*",
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Methods" : "OPTIONS,POST,GET,PUT"
            }, 
            body:JSON.stringify(identity_ID)
        };
        return response;
}
Run Code Online (Sandbox Code Playgroud)

Cognito 用户登录后,我可以在我的 React-Native 应用程序中使用Auth指令aws-amplifyfetch()来调用上面显示的 lambda 函数,方法是通过调用以下代码:

import { Auth } from 'aws-amplify';
var APIGatewayEndpointURL = 'https://5lstgsolr2.execute-api.us-west-2.amazonaws.com/default/-'
var response = {}

async function getIdentityId () {
       
   var session = await Auth.currentSession()
   var IdToken = await session.getIdToken()
   var jwtToken = await IdToken.getJwtToken()

   var payload = {}
       
   await fetch(APIGatewayEndpointURL, {method:"POST", body:JSON.stringify(payload), headers:{Authorization:jwtToken}})
       .then(async(result) => {
             response = await result.json()
             console.log(response)
        })
}
Run Code Online (Sandbox Code Playgroud)

有关如何使用身份验证的更多信息aws-amplify可以在此处找到https://docs.amplify.aws/ui/auth/authenticator/q/framework/react-native/#using-withauthenticator-hoc