向AWS Gateway API提出请求



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

我正在使用React本机,因此自动生成的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响应,但例外:不完整的Exignature Exception

此时,您应该具有有效的cognito发出的JWT。要在AWS API网关后面致电API,您需要与API通话一起传递JWT。这应该在授权标题中使用类型的承载者进行。您可以确定自定义授权器是否需要或仅使用API网关内置授权。

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

您还需要确保制定IAM规则,以允许用户池访问API网关端点 - http://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html

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

对于React Native,可以通过NPM获得:

npm install aws-amplify-react-native

如果使用Cognito用户池链接此处概述的库:https://github.com/aws/aws/aws-amplify/blob/master/media/media/quick_start.md#react-native-native-defefent

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

您可以使用API Gateway Endpoint使用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);
    },
});

有关更多详细信息,请检查此示例。

身份验证将jwttoken发送回到react Antive应用程序后,需要在授权标题中以令牌发送后续API请求。

在API Gateway配置Integration方法配置中的用户池授权器,因此它将自动验证授权标头并为端点加载用户上下文信息。

相关内容

  • 没有找到相关文章

最新更新