AWS Cognito HTTP身份验证

时间:2016-03-10 22:02:01

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

我尝试使用AWS API Gateway,Lambda和Cognito设置测试API,以确保访问安全。由于我是AWS世界的新手,我不知道如何创建一个"登录"使用例如request library向AWS服务发布请求 我想在客户端我首先必须通过Cognito和AWS Api登录,然后使用我获得的信息创建一个签名请求,如下所述:http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

如果我走错了路,请告诉我并指出正确的方向:)

3 个答案:

答案 0 :(得分:5)

序: 我将解释与Cognito的Google+集成流程,对其他人来说几乎是一样的。我将使用node.js(javascript),之后您可以让您的用户通过Google进行身份验证,并由IAM和Cognito授权访问API网关。

Cognito是一种联合登录服务,它可以让您同步"配置"您的移动/网络应用程序。首先,您必须与身份提供商设置cognito,比如说Google+。为此:

  1. 在您的开发者控制台中创建Google应用
  2. 在cognito中创建一个池并添加谷歌作为提供商,使用策略和角色(您希望授予您的用户访问权限的服务)配置您的池,在这种情况下只有API网关。
  3. 在您的网络/移动应用中,向用户显示Google+登录按钮,用户点击后,谷歌将回拨一个代码参数为code的回调网址,使用该代币
  4. 使用此代码为您的用户获取Cognito身份,在这种情况下,我们信任Google:
  5. var params = {
      IdentityPoolId: setting.POOL_ID,
      Logins: {
        'accounts.google.com': google_token  // Coming from Google OAuth2
      }
    }
    
    // Get Id from Cognito
    cognitoIdentity.getId(params, resolverFunction);
    
    1. 获取身份IdentityId(您的Google经过身份验证的用户:
    2. )的IAM临时凭证
      var params = {
        IdentityId: IdentityId,
        Logins: {
          'accounts.google.com': google_token // Coming from Google OAuth2
        }
      }
      cognitoIdentity.getCredentialsForIdentity(params, resolverFunction)
      
      1. 您的用户现已通过Google验证并获得IAM服务的授权(通过您附加到Cognito池的角色/政策)。
      2. 在您的API网关中,激活IAM授权,并使用您从第7点获得的凭据。
      3. 使用Accesskey,secretKey和令牌对您在API网关上构建的API的每个请求进行签名,您可以使用此lib:aws-v4-sign-small
      4. 快速笔记和单挑:

        • 所有这些都是异步操作,因此如果你在节点js中,那么使用Promises(ES6或Bluebird)会更好。
        • 过分关注你所附带的角色(访问dynamodb文档或S3文件等等。阅读更多关于IAM的信息,这对你来说很有帮助,你可以做一个细粒度的授权)

        希望它很清楚,或者至少它会给你一个开始的方向。

答案 1 :(得分:3)

使用API​​网关的一个好处是,您可以自动generate SDKs为您的API,它可以轻松地与Cognito凭据集成。这样可以免除自己实施SigV4 auth的麻烦。

以下是一些使用Cognito凭据和生成的JavaScript SDK的简单示例:

  1. https://github.com/rpgreen/aws-recipes/blob/master/app/index.html
  2. https://github.com/awslabs/api-gateway-secure-pet-store
  3. 干杯, 莱恩

答案 2 :(得分:0)

正如Ryan所说,最好的方法是通过API Gateway SDK。使用此堆栈的缺点是,与现成的前端工具集成变得更加困难。您不能再直接向REST端点请求,您将需要通过SDK。

你肯定会失去一些开发的简易性,因为你不能只在你的终端上打一些像ngResource这样的东西并且称它为一天。您必须自己设置对服务层中每个AWS端点的调用。