Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使对AWS网关API的请求反应为本机_Javascript_Amazon Web Services_React Native_Aws Api Gateway - Fatal编程技术网

Javascript 使对AWS网关API的请求反应为本机

Javascript 使对AWS网关API的请求反应为本机,javascript,amazon-web-services,react-native,aws-api-gateway,Javascript,Amazon Web Services,React Native,Aws Api Gateway,在我的应用程序中,用户可以通过AWS Cognito用户池或Facebook进行身份验证,所有这些都由AWS身份池管理。这一切都正常工作,用户可以成功登录和验证。现在,我需要向AWS网关API发出经过身份验证的请求,然后该API将触发Lambda函数。我不知道接下来会发生什么。我是否需要编写代码来签署这些请求,还是AWS javascript SDK已经为此内置了一些东西?我需要创建授权人吗?如何从AWS.config.credentials向网关API发出成功的、经过身份验证的请求 我使用的是

在我的应用程序中,用户可以通过AWS Cognito用户池或Facebook进行身份验证,所有这些都由AWS身份池管理。这一切都正常工作,用户可以成功登录和验证。现在,我需要向AWS网关API发出经过身份验证的请求,然后该API将触发Lambda函数。我不知道接下来会发生什么。我是否需要编写代码来签署这些请求,还是AWS javascript SDK已经为此内置了一些东西?我需要创建授权人吗?如何从AWS.config.credentials向网关API发出成功的、经过身份验证的请求

我使用的是React Native,因此自动生成的API无法工作

编辑:这是我的申请代码:

fetch('https://MY_API_GATEWAY_URL/prod/handleMessages/', {
方法:“GET”,
正文:空,
标题:{
授权:“承载者”+this.state.token,/*这是来自AWS Cognito的JWT令牌*/
},
})
。然后((响应)=>{
警报(JSON.stringify(响应,null,2))
})


我从中得到403个响应,但有一个例外:IncompleSignatureException

此时您应该拥有一个有效的Cognito JWT。要在AWSAPI网关后面调用API,需要将JWT与API调用一起传递。这应该放在带有承载类型的授权标头中。您可以确定是否需要自定义授权者,或者仅使用API网关的内置授权

更多信息可以在这里找到-

您还需要确保IAM规则已就位,以允许用户池访问API网关端点-

您可以在AWS Cognito UserPools身份验证之后,使用API网关端点从服务器端生成JWT令牌。e、 g
//验证

var authenticationData = {
    Username : 'username',
    Password : 'password',
};
var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);
var poolData = { UserPoolId : 'us-east-1_TcoKGbf7n',
    ClientId : '4pe2usejqcdmhi0a25jp4b5sh3'
};
var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);
var userData = {
    Username : 'username',
    Pool : userPool
};
var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result) {
        console.log('access token + ' + result.getAccessToken().getJwtToken());
        /*Use the idToken for Logins Map when Federating User Pools with Cognito Identity or when passing through an Authorization Header to an API Gateway Authorizer*/
        console.log('idToken + ' + result.idToken.jwtToken);
    },

    onFailure: function(err) {
        alert(err);
    },

});
有关更多详细信息,请查看

身份验证完成后,将jwtToken发送回React本机应用程序,需要在授权标头中将其与令牌一起发送,以用于后续API请求


在API网关上,在集成方法配置中配置用户池授权器,以便它将自动验证授权标头并加载端点的用户上下文信息。

您可以使用AWS Amplify library的API模块,该模块将自动签署请求:

对于React Native,可通过npm获得:

npm install aws-amplify-react-native
如果使用Cognito用户池链接库,如下所述:

API模块将让您为端点配置一个友好的名称,以及API网关阶段的调用URL。然后,只需调用HTTP方法并将可选参数作为选项传递:

import Amplify, {API} from 'aws-amplify-react-native';
Amplify.configure('your_config_file_here');
API.get('apiname', 'invokeURL', options).then(res=>{
    console.log(res);
});

谢谢你的回答。我用一些代码更新了我的问题。当我照你说的做时,我得到了一个例外。我打算调查一下,但只是想确认我已经做了我需要做的一切。也许AWS中存在权限问题。另外,如果我想使用默认授权程序,我需要配置任何东西才能工作吗?您可能需要设置IAM权限,以允许用户池访问API-进行更多读取,AWS.config.credentials包含accessKeyId和secretKey。最好使用这些来发出请求,并让IAM来处理权限,而不是授权人。这将允许任何身份提供者的用户访问API,不是吗?因为我不仅有Cognito用户池用户,还有Facebook,也许更像谷歌。谢谢你的回复。在进一步阅读时,AWS.config.credentials包含accessKeyId和secretKey。最好使用这些来发出请求,并让IAM来处理权限,而不是授权人。这将允许任何身份提供者的用户访问API,不是吗?因为我不仅有Cognito用户池用户,还有Facebook,也许更像谷歌。