我安装了 google_sign_in 并成功创建了我的 keytool sha 密钥,我配置了我的 google 控制台帐户并创建了凭据(我还启用了 People API)。
我将生成的 keytool 文件传递到 android/app 文件夹中,并将该代码放入 build.grandle 中:
signingConfigs{
debug{
keyAlias 'xxxxx'
storePassword 'xxxxx'
storeFile file('xxxxx.jks')
keyPassword 'xxxxx'
}
}
buildTypes {
release {
signingConfig signingConfigs.debug
}
debug{
signingConfig signingConfigs.debug
}
}
我也把它放在清单上:
<activity android:name="com.google.android.gms.auth.api.signin.internal.SignInHubActivity" />
当我运行它时,它仍然给我这样的错误:
I/flutter (32747): PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)
我还忘记了什么?
这是我的颤振代码:
final GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: ['email'],
clientId:"XXXXXXXXXXXX"
);
Future<void> google_LogIn(BuildContext context) async {
try {
print(1);
final GoogleSignInAccount? googleUser = await _googleSignIn.signIn();
print(2);
if (googleUser != null) {
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
print(3);
print('Token : ${googleAuth.idToken!}');
final response = await http.post(
Uri.parse('${dotenv.env['baseUrl']}/auth_google'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{
'idToken': googleAuth.idToken!,
}),
);
if (response.statusCode == 200) {
final Map<String, dynamic> user = jsonDecode(response.body);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Sign in successful! Welcome ${user['name']}')),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to sign in with Google')),
);
}
}
} catch (error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error occurred during Google sign in: $error')),
);
print(error);
}
}
还有我的节点服务器:
const { OAuth2Client } = require('google-auth-library');
//Google Auth
async auth_google(req, res) {
try {
const token = req.body.idToken;
const payload = await logIn_Controller.verify(token);
res.status(200).json(payload);
} catch (error) {
res.status(401).json({ error: 'Invalid token' });
}
},
async verify(token) {
const ticket = await client.verifyIdToken({
idToken: token,
audience: CLIENT_ID,
});
const payload = ticket.getPayload();
return payload;
},
当我尝试打印时,令牌也为空。
有时,如果我评论范围和 clientId,它会这样说:
I/flutter (18971): Null check operator used on a null value
那么我的问题是什么?
节点服务器甚至没有被触发,因此身份验证有问题,具体在此命令中:
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
因为第一个返回的是有关用户的一些信息数据。所以我猜测该特定命令中有问题。
我没有使用 Firebase 进行此身份验证流程。
相反,我以这种方式实现
Google Sign-In
。尝试一下看看它是否适合您的代码:
final GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: <String>[
'email',
'https://www.googleapis.com/auth/contacts.readonly',
],
);
GoogleSignInAccount? googleUser;
// Handling Google Sign-In
Future<GoogleSignInAccount?> handleGoogleSignIn() async {
try {
googleUser = await _googleSignIn.signIn();
if (googleUser != null) {
await createUserFromGoogleSignIn(googleUser!);
}
return googleUser;
} catch (error) {
print('Google Sign-In error: $error');
return null;
}
}
// Creating a user account from Google Sign-In information
Future<void> createUserFromGoogleSignIn(GoogleSignInAccount user) async {
var googleKey = await user.authentication;
print("Google Access Token: ${googleKey.accessToken}");
// Call API to authenticate or create a new user account
}
让我知道该解决方案是否适合您的情况!