gpt4 book ai didi

javascript - 如何使用 Facebook 对 Cognito 的 API 调用进行身份验证?

转载 作者:行者123 更新时间:2023-12-04 15:48:58 24 4
gpt4 key购买 nike

我想使用 Cognito 对用户进行身份验证,并可选择使用 Facebook。用户可以使用其中任一选项登录/注册。

我已经创建了 Cognito 用户池和 Cognito 联合身份,还创建了用于身份验证的 Facebook 应用程序。用户池和 Facebook 应用程序都连接到联合身份。

当我注册并稍后通过 Cognito 用户池对 Cognito 用户进行身份验证时,Cognito 会返回 accessToken,我将其存储在前端的 localStorage 中,并在需要进行身份验证时使用。

我有 /authenticate 端点 (express),它接受用户名和密码,如果一切顺利则返回 accessToken。每当我进行需要身份验证的 API 调用时,我都会发送我在本地存储中的 accessToken。它或多或少是这样的:

// POST user/authenticate
const authenticationData = {
Username: username,
Password: password
}

authenticationDetails = new AuthenticationDetails(authenticationData)

const userData = {
Username: username,
Pool: userPool()
}
cognitoUser = new CognitoUser(userData)

cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (res) => resolve(res), // here I get accessToken
onFailure: (err) => {
console.log('[authenticateUser error]', err)
reject(err)
},
//...

但是

当我使用 Facebook 时,我没有获得可以以相同方式使用的 accessToken。我通过 FB.login 从 Facebook 获得 accessToken,我将它传递给 Cognito 进行身份验证,然后我不知道该怎么做,因为我无法获得任何可用于验证需要 Cognito 身份验证的 API 调用的 token 。

这是我的做法:

await window.FB.login((response) => { 
props.userFacebookSignIn(response)
})
// ...

call(foo, 'users/facebook_sign_in', { accessToken: payload.facebookAccessToken })
// ...

// users/facebook_sign_in
AWS.config.region = config.AWSRegion
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'foo',
Logins: {
'graph.facebook.com': facebookAccessToken
}
})

AWS.config.credentials.get((err) => {
// Here I get no errors, I presume that I have logged Facebook user in
const accessKeyId = AWS.config.credentials.accessKeyId
const secretAccessKey = AWS.config.credentials.secretAccessKey
const sessionToken = AWS.config.credentials.sessionToken
// here I can do stuff probably,
// but I would like to receive token that would allow me to do stuff,
// rather than context I can do stuff in
})

虽然我正在做所有这些,但我有这种感觉,AWS 的开发人员将 Cognito 实现为前端解决方案,而不是用于后端的东西。如果我错了,请纠正我。

不过,我希望能够在 express 中间件中交替使用 Cognito 和 Facebook 来验证 api 调用。

这可能吗?谢谢。

最佳答案

我已将联合身份用于 salesforce 单点登录,但我想这些步骤将是相同的。在使用 facebook 进行身份验证后,您将收到他们的回应和 id_token。您必须将其作为参数传递给 getId方法:

var params = {
IdentityPoolId: 'STRING_VALUE', /* required */
AccountId: 'STRING_VALUE',
Logins: {
'<IdentityProviderName>': 'STRING_VALUE',
/* 'graph.facebook.com': ... */
}
};
cognitoidentity.getId(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});

在结果中,您将获得一个身份 ID,您可以将其保存在某处,这样您就不必在每次进行身份验证时都进行此调用。现在获取此身份 ID 并生成 getCredentialsForIdentity调用:

response = client.get_credentials_for_identity(
IdentityId='string',
Logins={
'string': 'string'
},
CustomRoleArn='string'
)

这最终会为您提供所需的临时访问 key 、 secret key 和 session key 。

关于javascript - 如何使用 Facebook 对 Cognito 的 API 调用进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54653012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com