Не могу настроить Google Auth, я использую Flutter+Node без FirebaseAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Не могу настроить Google Auth, я использую Flutter+Node без Firebase

Сообщение Anonymous »

Я пытаюсь решить проблему с Google Auth.
Когда я вхожу в систему, все работает нормально, я генерирую идентификатор, имя пользователя, адрес электронной почты и т. д., а затем пытаюсь аутентифицировать пользователя, чтобы он генерирует токен доступа (по какой-то причине не 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
Я передаю его в папку приложения и настраиваю build.gradle следующим образом:

Код: Выделить всё

 debug{
keyAlias 'androiddebugkey'
keyPassword 'mycode'
storeFile file('../app/mykey.jks')
storePassword 'mycode'
}
Так чего мне не хватает?
И действительно ли мне нужен этот ключ?
Я имею в виду, что я уже вхожу в свое приложение, когда выпустите, так что, может быть, это не нужно?
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/787 ... t-firebase
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»