Когда я вхожу в систему, все работает нормально, я генерирую идентификатор, имя пользователя, адрес электронной почты и т. д., а затем пытаюсь аутентифицировать пользователя, чтобы он генерирует токен доступа (по какой-то причине не idToken, этот токен имеет значение null).
Затем я отправляю токен в свой бэкэнд и пытаюсь его расшифровать... но безуспешно.
Я уже настроил генератор ключей для своего приложения для Android и передал sha1 в google.cloud.console, я включил API людей и добавил несколько областей, но все равно получаю эту ошибку:< /p>
Код: Выделить всё
Error: Wrong number of segments in token: (here is a large token,nearly 216 characters,seperated with 2 dots)
Код: Выделить всё
// ignore_for_file: avoid_print
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
//.envs
import 'package:flutter_dotenv/flutter_dotenv.dart';
//Libs
import 'package:google_sign_in/google_sign_in.dart';
import 'package:http/http.dart' as http;
GoogleSignIn _googleSignIn = GoogleSignIn(
//clientId: 'your-client_id.apps.googleusercontent.com',
scopes: scopes,
);
const List scopes = ['openid'];
class Google_Auth extends StatefulWidget {
const Google_Auth({super.key});
@override
State createState() => _Google_AuthState();
}
class _Google_AuthState extends State {
bool _isAuthorized = false;
GoogleSignInAccount? _currentUser;
Map? _userJson;
@override
void initState() {
super.initState();
_googleSignIn.onCurrentUserChanged
.listen((GoogleSignInAccount? account) async {
_isAuthorized = account != null;
setState(() {
_currentUser = account;
if (_currentUser != null) {
_userJson = {
'displayName': _currentUser!.displayName,
'email': _currentUser!.email,
'id': _currentUser!.id,
'photoUrl': _currentUser!.photoUrl,
};
print(_userJson);
} else {
_userJson = null;
}
});
});
_googleSignIn.signInSilently();
}
//Send User Data to Backend
Future send_Auth(String? token) async {
try {
if (token == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Failed to sign in with Google (token is null)'),
),
);
return;
}
final response = await http.post(
Uri.parse('${dotenv.env['baseUrl']}/auth_google'),
headers: {
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode({
'idToken': token,
}),
);
if (response.statusCode == 200) {
final Map 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) {
print(error);
}
}
//Auth Scopes
Future _handleAuthorizeScopes() async {
final bool isAuthorized = await _googleSignIn.requestScopes(scopes);
setState(() {
_isAuthorized = isAuthorized;
});
}
//Handle Sign In - Sign Out
Future _handleSignIn() async {
try {
GoogleSignInAccount? account = await _googleSignIn.signIn();
if (account == null) {
return null;
}
final googleSignInAuthentication = await account.authentication;
print(googleSignInAuthentication.accessToken);
print(googleSignInAuthentication.idToken);
send_Auth(googleSignInAuthentication.accessToken);
} catch (error) {
print(error);
}
}
Future _handleSignOut() async {
await _googleSignIn.disconnect();
setState(() {
_currentUser = null;
_userJson = null;
});
}
Widget _buildBody() {
final GoogleSignInAccount? user = _currentUser;
if (user != null) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
ListTile(
leading: GoogleUserCircleAvatar(
identity: user,
),
title: Text(user.displayName ?? ''),
subtitle: Text(user.email),
),
const Text('Signed in successfully.'),
if (!_isAuthorized) ...[
const Text('Additional permissions needed to read your contacts.'),
ElevatedButton(
onPressed: _handleAuthorizeScopes,
child: const Text('REQUEST PERMISSIONS'),
),
],
ElevatedButton(
onPressed: _handleSignOut,
child: const Text('SIGN OUT'),
),
],
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
const Text('You are not currently signed in.'),
ElevatedButton(
onPressed: _handleSignIn,
child: Text('Press here'),
)
],
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Google Sign In'),
),
body: ConstrainedBox(
constraints: const BoxConstraints.expand(),
child: _buildBody(),
),
);
}
}
Код: Выделить всё
const { OAuth2Client } = require('google-auth-library');
const logIn_Controller = {
async verify(token) {
try {
const client = new OAuth2Client(process.env.GOOGLE_AUTH_TOKEN);
const ticket = await client.verifyIdToken({
idToken: token,
audience: process.env.GOOGLE_AUTH_TOKEN,
});
const payload = ticket.getPayload();
return payload;
} catch (error) {
console.log(error);
}
},
//Google Auth
async auth_google(req, res) {
try {
const token = req.body.idToken;
console.log(token);
const payload = await logIn_Controller.verify(token);
console.log(payload);
res.status(200).json(payload);
} catch (error) {
console.log(error);
res.status(401).json({ error: 'Invalid token' });
}
},
module.exports = logIn_Controller;
Код: Выделить всё
keytool -genkey -v -keystore mykey.jks -keyalg RSA -keysize 2048 -validity 10000 -alias androiddebugkey
Код: Выделить всё
debug{
keyAlias 'androiddebugkey'
keyPassword 'mycode'
storeFile file('../app/mykey.jks')
storePassword 'mycode'
}
И действительно ли мне нужен этот ключ?
Я имею в виду, что я уже вхожу в свое приложение, когда выпустите, так что, может быть, это не нужно?
Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/787 ... t-firebase
Мобильная версия