代码之家  ›  专栏  ›  技术社区  ›  Justin Grant

仅Facebook/Google登录(无用户名/pwd)使用AWS Cognito和React

  •  5
  • Justin Grant  · 技术社区  · 8 年前

    我想构建一个react.js web应用程序(最终也是一个react原生iOS应用程序),它依赖于Facebook(以及后来的Google)进行身份验证,而不需要用户名/密码选项。我计划在AWS API网关中托管我的服务器端API(用于web和移动版本的应用程序)。

    现在我试图理解AWS Cognito应该如何融入这个应用程序。

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

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

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

    1 回复  |  直到 8 年前
        1
  •  8
  •   KiteCoder    8 年前

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

    Federated identities 习惯了 “为用户提供temproary 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身份池身份验证角色交换 JWT 对于AWS IAM credentials 在API调用中使用的。在其他两种方法中,JWT被用作身份验证器。在这个 answer 我更详细地解释了区别。

    因为Cognito标识池返回AWS IAM凭据,所以它的用途也更广泛。如果您的应用程序最终需要访问其他AWS服务(例如S3),那么Cognito标识池将是首选方法。

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

    对!我会尽量提供一些关于如何做到这一点的信息。

    首先,我强烈建议使用 AWS-Amplify 用于登录的库。此库提供以下方法:

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

    例如,一旦你在你的身份池中配置了Google(或Facebook)作为一个身份提供者,AWS Amplify可以很容易地让你执行登录( AWS Amplify Federated Identities )

    但是,也可以在没有AWS放大的情况下使用 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放大和无AWS放大)认证是一个两步过程。首先,你的应用必须通过Google或Facebook的认证才能获得JWT。其次,这个JWT被交换为IAM凭据,IAM凭据将用于API调用。

    认证流程:

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

    这个 documentation 关于Facebook的这些步骤将更详细。

    根据我自己的经验,我用 Okta 作为我的AWS身份池的身份提供程序,使用 OpenID . 与您类似,我没有使用用户池,因为这些服务是由Okta管理的。

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