我正在使用Go的AWS开发工具包来使用Cognito进行服务器端身份验证。我已完成注册和登录,并使用用户名和密码工作。我已经根据documentation配置了所有三个外部身份提供程序,以及重定向URL和文档需要的其他所有内容。
我知道如何获取Cognito将为您构建的内置“注册/登录”页面的URL,这些页面具有Google / Facebook / Amazon登录按钮,但是我需要能够将这些按钮放在我网站的前端。我不知道该怎么做。
编辑:请参阅@Stu帖子上的评论,以详细了解为什么JS SDK答案被标记为正确答案。这可能会有所更改,但暂时不会更改。 (tldr; aws go sdk和cognito根本不支持此功能)
答案 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
更新: 回到这一次。
在这里您可以看到一个名为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}`
其中platform
是Google
/ Facebook
/其他OIDC提供商等。
那只是URL,您需要自己按一下按钮,但它会直接重定向到提供者的同意