我有一个使用Google登录的React Native应用程序。目前,我可以使用我的手机登录的Google帐户之一登录,但我需要为我的Google帐户堆栈中的另一个Google帐户执行OAuth,这是为了获得 API 访问权限,我需要辅助帐户的 serverAuthToken
我用于谷歌登录的库 - https://github.com/react-native-community/google-signin
到目前为止我所做的:
const firebaseGoogleLogin = async () => {
try {
await GoogleSignin.hasPlayServices();
const userInfo = await GoogleSignin.signIn();
if (userInfo) {
await storeToken(userInfo);
// eslint-disable-next-line no-console
console.log('User info retrieved during login', userInfo);
}
// create a new firebase credential with the token
// eslint-disable-next-line max-len
const credential = firebase.auth.GoogleAuthProvider.credential(userInfo.idToken, userInfo.accessToken);
// login with credential
// eslint-disable-next-line no-unused-vars
const firebaseUserCredential = await firebase.auth().signInWithCredential(credential);
console.log('Logged in')
} catch (error) {
if (error.code === statusCodes.SIGN_IN_CANCELLED) {
console.log('sign in cancelled', error);
} else if (error.code === statusCodes.IN_PROGRESS) {
console.log('signin in progress error', error);
} else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
console.log('play services are not available or outdated', error);
} else {
console.log('some other error occurred', error);
}
}
};
上述代码的结果:
这是我用来使用我的主要 Google 帐户登录的代码,登录后我触发播放服务模式以使用上述内容与其他帐户登录,但该模式会在加载一秒后关闭并关闭,向我展示
Logged in
在日志中,由于我已经登录,在播放服务中自动绕过选择帐户的选项
上述问题仅在android中出现,ios似乎没问题即使使用帐户登录后
如果没有多帐户授权的方法,则试图进行黑客攻击,因为已经登录的帐户正在绕过播放服务模式,我正在考虑在用户登录我的应用程序后注销用户(进程级别)在主要活动中,我还可以使用游戏服务吗?这是正确的做法吗!
您可能已经解决了问题。我想下面的方法可以解决你的问题。注销后调用此方法。
signOut = async () => {
try {
await GoogleSignin.revokeAccess();
await GoogleSignin.signOut();
this.setState({ user: null }); // Remember to remove the user from your app's state as well
} catch (error) {
console.error(error);
}
};
首先从“@react-native-google-signin/google-signin”导入 { GoogleSignin };在您的注销文件中
如果您在之后使用 firbase 身份验证
auth().signOut().then(() => {
GoogleSignin.revokeAccess();
});
如果您使用多种方法登录并希望在注销时从应用程序注销谷歌帐户,如果用户没有通过谷歌登录登录应用程序,并且您尝试调用 GoogleSignin.revokeAccess() ,它将抛出错误: GoogleSignin.撤销错误 SIGN_IN_REQUIRED。 无论使用何种登录方式,都要安全地从 Google 注销:
const hasPreviousSignIn = async () => {
const isSignedIn = GoogleSignin.isSignedIn();
if (isSignedIn) {
await GoogleSignin.signOut();
await GoogleSignin.revokeAccess();
}
}