向AWS Gateway API发出请求React Native

时间:2017-09-05 15:47:41

标签: javascript amazon-web-services react-native aws-api-gateway

在我的应用中,用户可以通过AWS Cognito用户池或Facebook进行身份验证,所有人都可以管理AWS身份池。这一切都正常,用户可以成功登录和验证。现在,我需要向AWS Gateway API发出经过身份验证的请求,然后触发Lambda函数。我对接下来会发生什么感到困惑。我是否需要编写代码来签署这些请求,或者AWS javascript SDK是否已经内置了这些内容?我需要创建一个授权人吗?如何从AWS.config.credentials转到成功通过网关API验证的请求?

我正在使用React Native,因此自动生成的API无效。

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

fetch('https://MY_API_GATEWAY_URL/prod/handleMessages/', { method: 'GET', body: null, headers: { Authorization: 'Bearer ' + this.state.token, /* this is the JWT token from AWS Cognito. */ }, }) .then((response) => { alert(JSON.stringify(response, null, 2)) })

我从此得到403响应,异常:IncompleteSignatureException

3 个答案:

答案 0 :(得分:2)

此时您应该拥有有效的Cognito颁发的JWT。要在AWS API Gateway后面调用API,您需要将JWT与API调用一起传递。这应该在具有Bearer类型的Authorization标头中。您可以确定是否需要自定义授权程序,或者仅使用API​​网关的内置授权。

可在此处找到更多信息 - http://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html

您还需要确保IAM规则到位以允许UserPool访问API网关端点 - http://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html

答案 1 :(得分:1)

您可以使用API​​网关端点在AWS Cognito UserPools身份验证之后从服务器端生成JWT令牌。例如/<stage>/authenticate

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);
    },

});

有关详细信息,请查看this example

在身份验证之后,将jwtToken发送回React Native应用程序,在该应用程序中,需要在Authorization标头中发送该标记以及后续API请求的标记。

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

答案 2 :(得分:1)

您可以使用AWS Amplify库的API模块自动签署请求:https://github.com/aws/aws-amplify

对于React Native,这可以通过npm:

获得
npm install aws-amplify-react-native

如果使用Cognito用户池链接库,请按照此处所述:https://github.com/aws/aws-amplify/blob/master/media/quick_start.md#react-native-development

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);
});