我有一个 Angular 10 网站。我有一个 AWS Lambda (ASP.NET Core 3.1),它使用 AWS Cognito 为具有电子邮件/密码的用户进行身份验证。但我想让用户也可以使用 Facebook(最终是谷歌)登录。在 Facebook/Google 场景中,我的想法是暂时不允许直接访问 AWS 服务(如 S3 等),而是通过不记名令牌与我的其他 lambda 交互。我有一个 Cognito 用户池,为此我创建了 Facebook 身份提供者和映射。我在某处读到我需要一个身份池。所以我创建了它并将我的 Cognito 用户池作为提供商和 Facebook 放入。
使用 JavaScript 代码:
loginWithFacebook = () => {
const login$ = from(this.facebookService.login());
login$.subscribe(
(response: LoginResponse) => {
console.log(response);
this.facebookLoginToAWS(response);
},
error => {
console.error(error);
}
);
};
我可以得到 Facebook 身份验证响应没问题。然后使用您在每个博客、Stack Overflow 帖子甚至 AWS 文档中看到的这段代码(当然,替换为我自己的 IdenityPoolId):
private facebookLoginToAWS = (facebookResponse: LoginResponse) => {
console.log('facebookLoginToAWS', facebookResponse);
if (facebookResponse.status === 'connected' && facebookResponse.authResponse) {
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
Logins: { 'graph.facebook.com': facebookResponse.authResponse.accessToken }
}, {
region: 'eu-west-1'
});
AWS.config.credentials.get((err) => {
if (err) {
return console.log("Error", err);
}
console.log("Cognito credentials", AWS.config.credentials);
console.log("Cognito Identity Id", AWS.config.credentials.identityId);
});
} else if (facebookResponse.status === 'not_authorized') {
document.getElementById('facebookStatus').innerHTML = 'Please log into this app.';
} else {
document.getElementById('facebookStatus').innerHTML = 'Please log into Facebook.';
}
};
我可以取回会话令牌(除了大量其他内容,如 accesKeyId、identityId 和 secretAccessKey)。
但是我该如何处理该会话令牌?也许我很困惑,但我认为因为 Facebook 字段和 Cognito 字段之间存在映射,所以 Facebook 用户会以某种方式迁移到 Cognito 用户池中,我可以为我的其他 lambdas 获取该用户的 JWT 令牌。但是在检查 AWS 仪表板后,我可以在身份池中看到登录(我认为),但没有相应的用户池条目。
我是否必须以某种方式手动迁移它(使用 AWS JavaScript 开发工具包)?我不想使用 Amplify 库。我想错了吗?我是否以某种方式将会话令牌用作其他 lambda 的承载令牌?我是否需要以某种方式将该人添加为用户池用户?