在我的应用中,用户可以通过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
答案 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);
});