【问题标题】:AWS Cognito HTTP authenticationAWS Cognito HTTP 身份验证
【发布时间】:2016-06-25 23:45:20
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    Cognito 是一种联合登录服务,它可以让您同步移动/网络应用的“配置”。首先,您必须使用身份提供者设置 cognito,例如 Google+。为此:

    1. 在您的开发者控制台中创建一个 Google 应用
    2. 在 cognito 中创建一个池并将 google 添加为提供程序,使用策略和角色配置您的池(您希望让您的用户访问的服务,在这种情况下只有 API 网关)。
    3. 在您的网络/移动应用中,显示用户 Google+ 登录按钮,用户点击后,谷歌将回调一个带有代码参数 code 的回调 url,使用该令牌
    4. 使用此代码为您的用户获取 Cognito 身份,在这种情况下,我们信任 Google:
    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 身份验证用户)的 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 Gateway 之上的 API 发出的每个请求,您可以使用这个库:aws-v4-sign-small

    快速笔记和提示:

    • 所有这些都是异步操作,所以如果你在 node js 中,最好使用 Promises(ES6 或 Bluebird)。
    • 特别注意您附加的角色(访问 dynamodb 文档或 S3 文件等。阅读有关 IAM 的更多信息,这很有帮助,您可以进行细粒度授权)

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

    【讨论】:

    • 非常感谢:我试过这样:[code]var ci = new AWS.CognitoIdentity({region: 'us-east-1'}); var params = { AllowUnauthenticatedIdentities: false, IdentityPoolName: 'xxxx', Logins: { 'graph.facebook.com': fbCredentials } }; ci.createIdentityPool(params, console.log);[/code] 但我收到错误消息说参数 Logins 是意外的:/
    • createIdentityPool 在 UI/AWS 控制台中执行,如果您有一个应用程序,我认为通过代码进行它是没有意义的。如果你还是想这样做,参数中的关键是“SupportedLoginProviders”而不是“登录”,我认为 javascript 文档很有帮助。
    【解决方案2】:

    使用 API Gateway 的好处之一是您可以自动为您的 API 提供generate SDKs,从而轻松与 Cognito 凭据集成。这使您免于自己实施 SigV4 身份验证的麻烦。

    以下是使用 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

    干杯, 瑞恩

    【讨论】:

    • 生成的代码不是很干净,编辑起来很乱。另一方面,如果你想为你的 API 制作一个 js 客户端,你可以对 AWS SDK 进行逆向工程,你会发现他们有一个从 json 文件构建 API 的工厂。该类称为 AWS.Model.Api(),这就是我最终使用的。
    【解决方案3】:

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

    您肯定会失去一些开发的便利性,因为您不能只是在端点上添加类似 ngResource 之类的东西然后收工。您必须自己设置对服务层中每个 AWS 端点的调用。

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 1970-01-01
      • 2017-01-02
      • 2018-05-22
      • 1970-01-01
      • 2016-12-22
      • 2022-01-26
      • 2020-01-30
      • 2016-08-20
      相关资源
      最近更新 更多