在我的应用中,用户可以通过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方法配置中的用户池授权器,因此它将自动验证授权标头并为端点加载用户上下文信息。