Facebook/Google-only 次使用 AWS Cognito 和 React 登录(无 username/pwd 次)

Facebook/Google-only logins (no username/pwd) with AWS Cognito and React

我想构建一个 react.js 网络应用程序(最终也是一个 React Native iOS 应用程序),它依赖于 Facebook(以及后来的 Google)进行身份验证而无需username/password 选项。我计划在 AWS API 网关中托管我的服务器端 API(适用于应用程序的 Web 和移动版本)。

现在我正在尝试了解 AWS Cognito 应如何融入此应用程序。

首先,我假设我不需要 Cognito 用户池,因为我只需要联合社交登录,而不是username/password 登录。这个假设正确吗?

其次,我假设我 需要一个 Cognito 身份池来轻松验证我的应用程序对 AWS API 网关的调用。这个假设是否正确?如果我的应用程序对 AWS 服务的所有访问都将通过调用 AWS API 网关端点,这是否仍然正确?

第三,是否有像这样的仅社交登录用例的 public 代码示例?我在 AWS 文档中可以找到的所有示例似乎都假定使用了 Cognito 用户池。我能找到的最接近的是一个 archived GitHub issue,它似乎接近我的用例,但它没有响应。 ;-(

首先,我假设我不需要 Cognito 用户池,因为我只需要联合社交登录,而不是 username/password 登录。这个假设正确吗?

Federated identities 用于 “为用户提供临时 AWS 凭据...” - 因此,如果您只想通过联合登录提供临时访问权限,那么这假设是正确

如果您想管理用户组和配置文件以及其他用户服务,您将需要用户池。但是,根据您的问题,这不是必需的。

其次,我假设我确实需要一个 Cognito 身份池来轻松验证我的应用程序对 AWS API 网关的调用。这个假设是否正确?如果我的应用程序对 AWS 服务的所有访问都将通过调用 AWS API 网关端点,这是否仍然正确?

您的假设 正确,但是,我想添加有关使用 API 网关进行身份验证的信息,以便您了解存在哪些其他方法。

Cognito 身份池是针对 API 网关进行身份验证的一种方式。使用 API 网关

进行身份验证的三种方法
  1. Cognito Identity Pool Authenticated Role
  2. API Gateway Identity Pool Authorizer
  3. API Gateway Lambda Authorizer

方法 1方法 2 &3 之间的主要区别是身份验证模式。 Cognito Identity Pool Authenticated Role Exchanges a JWT for AWS IAM credentials that are used in API calls. In the other two methods the JWT is used as the authenticator. In this 我更详细地解释了差异。

因为 Cognito Identity Pool returns AWS IAM 凭证,它的用途也更广泛。如果您的应用程序最终需要访问其他 AWS 服务(例如 S3),那么 Cognito Identity Pools 将是首选方法。

第三,是否有像这样的仅社交登录用例的 public 代码示例?

是的!我将尝试提供一些有关如何执行此操作的信息。

首先,我强烈建议使用 AWS-Amplify 库进行登录。该库提供方法:

  1. 使用 Cognito 用户池进行身份验证
  2. 使用从身份验证收到的 AWS IAM 凭证向 API 网关发出 Sig v4 请求

例如,一旦您将 Google(或 Facebook)配置为身份池中的身份提供商,AWS Amplify 可以轻松让您执行登录 (AWS Amplify Federated Identities)

但是,这也可以在没有 AWS Amplify 的情况下使用 AWS JavaScript SDK. Example:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030',
  Logins: { // optional tokens, used for authenticated login
    'graph.facebook.com': 'FBTOKEN',
    'www.amazon.com': 'AMAZONTOKEN',
    'accounts.google.com': 'GOOGLETOKEN'
  }
});

识别 在两种解决方案(使用 AWS-Amplify 和不使用 AWS-Amplify)中,身份验证都是一个两步过程。首先,您的应用必须使用 Google 或 Facebook 进行身份验证才能接收 JWT。其次,此 JWT 被交换为将用于 API 调用的 IAM 凭据。

身份验证流程:

  1. 应用使用身份提供者的 SDK 向身份提供者(例如 FaceBook)进行身份验证。作为响应,身份提供者发送将由应用程序缓存的 JWT。
  2. 应用程序使用缓存的 JWT 向 AWS 进行身份验证。如果在 AWS 中配置了身份提供者,作为响应,AWS 会发送 IAM 凭据以及授予该身份提供者的权限。
  3. IAM 凭据用于向 API 网关发出 Sig v4 请求

documentation 详细介绍了有关 Facebook 的这些步骤。

根据我自己的经验,我使用了Okta as an identity provider for my AWS Identity Pool using OpenID。与您类似,我没有使用用户池,因为这些服务由 Okta 管理。

This 是了解“无服务器”身份验证的另一个重要资源。