如何将Cognito Identity Pool与API Gateway集成?

时间:2016-11-24 02:55:52

标签: amazon-web-services aws-api-gateway amazon-cognito

我对Cognito和API Gateway的集成有疑问,希望您能帮助我。我正在考虑制作一个应用程序,我希望与第三方(Facebook,Twitter ...)进行身份验证过程,因此我放弃了Cognito用户池,然后我有Cognito Identity Pool,但这是我怀疑的地方。< / p>

  • 如何将其与API网关集成?
  • 我应该使用API​​网关自定义授权程序来管理Cognito生成的令牌吗?
  • 如果我不使用自定义授权器,如何根据用户配置文件(管理员,客户端...)限制对API方法的访问?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

如何将其与API网关集成?

  • 对于Cognito Identity Pool,您可以将方法的授权类型设置为AWS_IAM

我应该使用API​​网关自定义授权程序来管理Cognito生成的令牌吗?

  • 使用身份池,这是不可能的。您必须使用AWS_IAM授权。您可以访问后端呼叫的Cognito ID。

如果我不使用自定义授权程序,如何根据用户配置文件(管理员,客户端...)限制对API方法的访问?

  • 更熟悉的Cognito能够更好地回答,但我相信您只能设置经过身份验证的角色&#39;以及未经身份验证的角色&#39;。因此,当用户通过外部提供商进行身份验证时,他们会获得经过身份验证的角色&#39;就是这样。我不确定身份池中是否支持用户组(管理员,客户端)(用户池中有支持)。

编辑:也许这会有助http://www.slideshare.net/AmazonWebServices/securing-serverless-workloads-with-cognito-and-api-gateway-part-i-aws-security-day

答案 1 :(得分:0)

如果授权者设置为AWS_IAM,则可以使用aws-sdk生成对API网关的签名请求。首先获得一些临时凭据,然后创建一个签名的请求。

获取凭据(例如javascript sdk的示例):

var AWS = require('aws-sdk')

var cognitoidentity = new AWS.CognitoIdentity();

var makeSignedRequest = async function () {
    var params = {
      IdentityId: 'STRING_VALUE', /* required */
      CustomRoleArn: 'STRING_VALUE',
      Logins: {
        '<IdentityProviderName>': 'STRING_VALUE',
        /* '<IdentityProviderName>': ... */
      }
    };
    var credsForIdentity = await cognitoidentity.getCredentialsForIdentity(params).promise()
    var httpRequest = new AWS.HttpRequest("https://<API_GATE_WAY_ENDPOINT", "<region>");
    httpRequest.headers.host = "<API_GATE_WAY_ENDPOINT>"; // Do not specify http or https!!

    AWS.config.credentials = {
        accessKeyId: creds.Credentials.AccessKeyId,
        secretAccessKey: creds.Credentials.SecretKey,
        sessionToken: creds.Credentials.SessionToken
    }
    httpRequest.method = "POST";
    httpRequest.body = JSON.stringify(data)

    var v4signer = new AWS.Signers.V4(httpRequest, "execute-api");
    v4signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate());

    const rawResponse = await fetch(httpRequest.endpoint.href , {
        method: httpRequest.method,
        headers: httpRequest.headers,
        body: httpRequest.body
    });


}

这个示例并不完美,但是它是AWS中签名请求的一个很好的起点。

当然,不要忘记为您的身份验证提供适当的权限,以便它们可以调用API。