使用React将AWS Cognito与google和自定义登录集成的步骤

时间:2017-10-23 12:33:22

标签: reactjs google-signin aws-cognito

您好任何人都可以告诉我将AWS cognito集成到自定义(用户名/密码)和Google登录的步骤吗?我能够毫无问题地使自定义登录工作。我能够在没有任何问题的情况下配置用户池。我只是徘徊在客户端的变化。

我使用amazon-cognito-identity-js和aws-sdk包。

以下是我使用的一些代码段。这里我使用参数来决定验证器。 如果你们中的任何人能提供任何反馈,那就太好了。谢谢。

export function getAwsCredentials(userToken, type) {
  let authenticator = '';
  

  if (type == 'CUSTOM') {
    authenticator = `cognito-idp.${config.cognito
      .REGION}.amazonaws.com/${config.cognito.USER_POOL_ID}`;
  }
  else if (type == 'GOOGLE') {
    authenticator = 'accounts.google.com';
  }

  AWS.config.update({ region: config.cognito.REGION });

  AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: config.cognito.IDENTITY_POOL_ID,
    Logins: {
      [authenticator]: userToken

    }
  });

  return AWS.config.credentials.getPromise();
}

1 个答案:

答案 0 :(得分:1)

对于联合身份池,您确实可以对待所有令牌。您只需更改登录地图中的[authenticator]

据推测,调用你的getAwsCredentials函数的代码会知道令牌的来源,并且可以传递一个参数,就像你上面所做的那样。

我想提一下,我认为这不一定是一种可怕的方法。我可以直接传递[authenticator]值,代替type,但这是一个相对较小的事情。我的主要观点是可能很好让责任知道令牌来自调用代码,而不是你的被调用函数。

使用令牌

确定身份提供者

当然,同样有效的方法可能需要或需要将身份提供者从令牌本身中拉出来。

当您integrate with Google directly时,您会从Google获得一个令牌,然后将其传递给Cognito(如上面的代码所示)。如果你解码令牌,你会发现

"iss": "accounts.google.com",

在某处。

同样,当您直接与用户池集成时,从用户池(稍后提供给身份池)获得的令牌包含以下内容:

"iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx",

通过这种方式,您可以通过检查其令牌来了解用户的登录方式。

关于Cognito Hosted UI的说明

如果您使用Cognito的托管用户界面登录Google,您将从Cognito获得access_tokenid_token(通过重定向)。在这种情况下,所有令牌都来自相同的位置(Cognito),这意味着您无法依赖任何调用代码来了解真实身份的身份提供者是。

在这种情况下,如果您的应用程序关心IDP是谁,您必须打开令牌。 id_token的这部分是你可能会追求的:

  "identities": [
    {
      "userId": "100000000000000000000",
      "providerName": "Google",
      "providerType": "Google",
      "issuer": null,
      "primary": "true",
      "dateCreated": "1507749926267"
    }
  ],
  "token_use": "id",
  "auth_time": 1509303233,
  "name": "Your User",
  "exp": 1509306833,
  "iat": 1509303233,
  "email": "youruser@gmail.com"