【问题标题】:How can integrate Cognito Identity Pool with API Gateway?如何将 Cognito 身份池与 API 网关集成?
【发布时间】:2017-04-08 05:23:45
【问题描述】:

我有一个关于 Cognito 和 API Gateway 集成的问题,希望您能帮助我。我正在考虑制作一个应用程序,我希望在其中与第三方(Facebook、Twitter ...)进行身份验证,所以我放弃了 Cognito 用户池,然后我有了 Cognito 身份池,但这是我怀疑的地方。

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

感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

    获取凭据(以 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。

    【讨论】:

      【解决方案2】:

      如何将它与 API Gateway 集成?

      • 对于 Cognito 身份池,您将方法上的授权类型设置为 AWS_IAM

      我应该使用 API Gateway Custom Authorizer 来管理 Cognito 生成的令牌吗?

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

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

      • 熟悉Cognito的人会更好回答,但我相信你只能设置“认证角色”和“未认证角色”。因此,当用户通过外部提供商进行身份验证时,他们会获得“经过身份验证的角色”,仅此而已。我不确定身份池中是否支持用户组(管理员、客户端)(用户池中有支持)。

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

      【讨论】:

      • 如何使用 AWS_IAM 设置授权? Authorizers 的唯一选项是 Lambda 函数和用户池(不是身份池)。
      • @KimberlyW - 您直接将 AWS_IAM 设置为授权方,您不使用自定义授权方。
      猜你喜欢
      • 1970-01-01
      • 2017-02-28
      • 2016-09-26
      • 1970-01-01
      • 2017-10-25
      • 2018-08-31
      • 1970-01-01
      • 2017-02-10
      • 2017-03-07
      相关资源
      最近更新 更多