将外部身份提供程序与服务器端身份验证结合使用

时间:2018-10-03 01:12:39

标签: amazon-web-services go server-side amazon-cognito

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

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

编辑:请参阅@Stu帖子上的评论,以详细了解为什么JS SDK答案被标记为正确答案。这可能会有所更改,但暂时不会更改。 (tldr; aws go sdk和cognito根本不支持此功能)

3 个答案:

答案 0 :(得分:4)

让我们以Facebook为例。当您使用Cognito用户界面时,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连接起来。我尚未使用该服务,因此目前无法对此进行过多介绍。

答案 1 :(得分:3)

您对应用程序的要求已经超过了使用cookie切割器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.');
  }

});

然后像这样获得用户:

    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());
        });
    }

其他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集成的解决方案。您可以清楚地处理所有身份验证流程,令牌管理,创建用于登录,注销等的api。使用GO SDK的服务器端

答案 2 :(得分:1)

identity_provider请求中的oauth2/authorize道具现在成为可能

在我的代码中看起来像这样

const query = stringify({
    response_type: 'code',
    redirect_uri: tokenRedirectUri,
    state: stateEncoded,
    client_id: clientId,
    identity_provider: platform,
})


return `https://auth.${domainName}/oauth2/authorize?${query}`

其中platformGoogle / Facebook /其他OIDC提供商等。

那只是URL,您需要自己按一下按钮,但它会直接重定向到提供者的同意