使用外部身份提供程序进行服务器端身份验证

Geo*_* IV 8 server-side go amazon-web-services amazon-cognito

我正在使用AWS SDK for Go使用Cognito进行服务器端身份验证.我已完成注册和登录,并使用用户名和密码进行操作.我根据文档配置了所有三个外部身份提供程序,以及重定向URL和文档所要求的其他所有内容.

我知道如何获取Cognito将为您构建的内置注册/登录页面的URL,以及那些具有Google/Facebook/Amazon登录按钮的URL,但我需要能够将这些按钮放在前端我的网站.我不知道该怎么做.

编辑:有关为什么JS SDK答案被标记为正确答案的详细原因,请参阅@Stu帖子上的评论.这可能会有所变化,但不会有一段时间.(tldr; aws go sdk和cognito还不支持这个)

F_S*_*O_K 5

让我们以 Facebook 为例。当您使用 Cognito UI 时,Facebook 会直接将 OAuth 令牌交给您的用户的 Cognito。Cognito 会执行一些操作,例如检查用户是否已存在,并根据需要创建一个新用户,然后向您的应用程序发送一个 AWS OAuth 令牌。

现在,如果您希望在自己的网站上使用 Facebook 按钮,则身份验证会以不同的方式进行。您必须亲自与 Facebook 协商,为用户取回 OAuth 令牌,然后将访问令牌交给 Cognito。Cognito 将完成其工作并返回一个 AWS OAuth 令牌。

因此,简而言之,您需要遵循 Facebook SDK 设置说明: https://developers.facebook.com/docs/facebook-login/web

Facebook SDK 在您的会话中放置一个访问令牌,您将其发送到 Cognito。

完整详细信息位于: https://docs.aws.amazon.com/cognito/latest/developerguide/facebook.html (请参阅 javascript 部分)

编辑:我刚刚遇到 AWS Amplify。它有一个包含身份验证组件的客户端 JS 库。如果您使用的是 React,看起来有一种非常简单的方法可以将联合身份(社交媒体登录)与 Cognito 连接https://aws-amplify.github.io/amplify-js/media/authentication_guide.html。我还没有使用过这项服务,所以目前不能透露太多。


小智 4

您的应用程序要求已经超过了使用千篇一律的 Cognito 登录流程的程度。

我建议您处理所有身份验证以认知自己,如下所示: https://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-javascript-examples.html

这样,您就可以在您的网站上添加 Facebook 登录按钮,如下所示: https: //docs.aws.amazon.com/cognito/latest/developerguide/facebook.html

FB.login(function (response) {

  // Check if the user logged in successfully.
  if (response.authResponse) {

    console.log('You are now logged in.');

    // Add the Facebook access token to the Cognito credentials login map.
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: 'IDENTITY_POOL_ID',
      Logins: {
        'graph.facebook.com': response.authResponse.accessToken
      }
    });

    // Obtain AWS credentials
    AWS.config.credentials.get(function(){
        // Access AWS resources here.
    });

  } else {
    console.log('There was a problem logging you in.');
  }

});
Run Code Online (Sandbox Code Playgroud)

然后像这样获取用户:

    var data = { UserPoolId : 'us-east-1_Iqc12345',
        ClientId : '12345du353sm7khjj1q'
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(data);
    var cognitoUser = userPool.getCurrentUser();

    if (cognitoUser != null) {
        cognitoUser.getSession(function(err, session) {
            if (err) {
                alert(err);
                return;
            }
            console.log('session validity: ' + session.isValid());
        });
    }
Run Code Online (Sandbox Code Playgroud)

其他 Facebook SDK 信息: https://developers.facebook.com/docs/facebook-login/web

因为您将在应用程序中完成设置 Cognito 流程的动作。另外一个要点是,我强烈建议您继续使用 lambda 触发器设置自定义消息。 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-message.html

更新:再次回到这一点。

https://docs.aws.amazon.com/sdk-for-go/api/service/cognitoidentityprovider/#CognitoIdentityProvider.AdminInitiateAuth

在这里您可以看到一个名为 AdminInitiateAuth 的函数。还有用于将用户附加到身份提供者的功能。因此,虽然使用 JS SDK 可能是最简单的,但在我看来,这是将 Web 应用程序与 Cognito 集成的解决方案。您可以使用 GO SDK 清楚地处理所有身份验证流程、令牌管理、创建用于登录、注销等的 api。