AWS Cognito HTTP 身份验证

AWS Cognito HTTP authentication

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

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

使用 API 网关的好处之一是您可以自动 generate SDKs 为您的 API,这很容易与 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

干杯, 瑞安

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

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

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

Cognito 是一种联合登录服务,它可以让您同步 "configuration" 您的 mobile/web 应用程序。首先,您必须使用身份提供者设置 cognito,例如 Google+。为此:

  1. 在您的开发者控制台中创建一个 Google 应用程序
  2. 在 Cognito 中创建一个池并将 google 添加为提供者,使用策略和角色配置您的池(您希望授予用户访问权限的服务,在本例中仅 API网关)。
  3. 在您的 web/mobile 应用中,向用户显示 Google+ 登录按钮,在用户点击它后,google 将使用代码回调 url参数 code,使用那个标记
  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 的 IAM 临时凭证,您的 Google 认证用户:
var params = {
  IdentityId: IdentityId,
  Logins: {
    'accounts.google.com': google_token // Coming from Google OAuth2
  }
}
cognitoIdentity.getCredentialsForIdentity(params, resolverFunction)
  1. 您的用户现已通过 Google 验证并获得 IAM 服务的授权(通过您附加到 Cognito 池的 roles/policies)。
  2. 在您的 API 网关中,激活 IAM 授权,并使用您从第 7 点获得的凭据。
  3. 使用 Accesskey、secretKey 和 token 为你在 API 网关之上构建的 API 发出的每个请求签名,你可以使用这个库:aws-v4-sign-small

快速笔记和提示:

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

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