react-native - AWS Amplify currentAuthenticatedUser 在 React Native 中 FB 登录后为空,但是当重新加载应用程序时,currentAuthenticatedUser 返回有效用户
问题描述
我正在尝试将 Facebook 登录集成到我的 React Native 应用程序中。
我已经能够成功实现 Auth.signIn() 方法,并且我可以使用 Auth.currentAuthenticatedUser() 始终如一地检索用户。
但是,当我从 Facebook 登录获取代码后使用 Auth.currentAuthenticatedUser() 时,它返回 null。
更重要的是,当我重新加载应用程序时, Auth.currentAuthenticatedUser() 按预期返回用户。
我不明白为什么在我使用令牌创建用户会话后,它无法识别我有一个经过身份验证的用户。
这是我的代码:
getTokenbyCode = async (code) => {
const details = {
grant_type: 'authorization_code',
code,
client_id: userPool.clientId,
redirect_uri: AuthSession.getRedirectUrl()
}
const formBody = Object.keys(details)
.map(
key => `${encodeURIComponent(key)}=${encodeURIComponent(details[key])}`
)
.join("&");
await fetch(
tokenURL,
{
method: "POST",
headers: {
'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
},
body: formBody
}
)
.then(async (res) => {
let tokenRequestJson = await res.json();
const IdToken = new CognitoIdToken({ IdToken: tokenRequestJson.id_token });
const AccessToken = new CognitoAccessToken({ AccessToken: tokenRequestJson.access_token });
const RefreshToken = new CognitoRefreshToken({ RefreshToken: tokenRequestJson.refresh_token })
try {
let userSession = new CognitoUserSession({ IdToken, AccessToken, RefreshToken });
const userData = {
Username: userSession.idToken.payload.email,
Pool: userPool
};
cognitoUser = new CognitoUser(userData);
cognitoUser.setSignInUserSession(userSession);
cognitoUser.getSession(async (err, session) => { // You must run this to verify that session (internally)
if (session.isValid()) {
// EVERYTHING WORKS UP TO HERE <!---------------->
let cognitoUser = await Auth.currentAuthenticatedUser()
this.setState({user: cognitoUser})
this.props.navigation.navigate('AuthLoading', {user: cognitoUser})
} else {
console.log('session is not valid: ', session);
}
})
}
catch (FBSignInError) {
console.log('FBSignInError: ', FBSignInError)
}
})
.catch(error => {
console.log('error: ', error);
});
}
解决方案
我发现了这一点,但只是通过蛮力,所以如果有人想告诉我为什么会这样,我会很高兴听到它。
我的猜测是,通过使用 Auth 模块设置用户会话,它将用户令牌存储在正确的位置,以便 Auth.currentAuthenticatedUser 可以获取它。
cognitoUser = new CognitoUser(userData);
cognitoUser.setSignInUserSession(userSession);
let authUser = Auth.createCognitoUser(cognitoUser.getUsername())
authUser.setSignInUserSession(userSession)
创建 cognitoUser 可能不是必需的,但它正在工作,所以我很擅长。
推荐阅读
- r - 使用条件和子类别过滤(分层)数据
- elasticsearch - 在 ruby fiter 下使用 Time.parse 时,Logstash 解析失败
- java - Kubernetes 外部连接到 Mongodb 集群
- javascript - 一个函数中有多个事件处理程序
- elixir - JSON 响应的单元测试,匹配 JSON 响应以断言键和值
- r - 在库函数中分配变量
- angular - Angular 6.x 元标记 OG:描述不适用于 FB
- unit-testing - Rails 升级后的神秘 rspec 错误
- javascript - 如何使用 JS 动态创建 SVG 文本元素
- python - 处理的 python 是固定在一个 CPU 上,还是可以使用多个 CPU 超时?