#flutter #google-api #youtube-data-api
Вопрос:
Я хочу аутентифицировать пользователя для загрузки видео на его канал ,обязательным параметром является просто успешная аутентификация или нет, в настоящее время я работаю с этими 3 плагинами google_sign_in
googleapis
extension_google_sign_in_as_googleapis_auth
, с помощью которых я могу войти в учетную запись Google пользователя только с помощью firebase
.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:googleapis/youtube/v3.dart';
GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: <String>[
'email',
//'https://www.googleapis.com/auth/youtube.readonly',
],
);
void main() {
runApp(
MaterialApp(
title: 'Google Sign In',
home: SignInDemo(),
),
);
}
class SignInDemo extends StatefulWidget {
@override
State createState() => SignInDemoState();
}
class SignInDemoState extends State<SignInDemo> {
GoogleSignInAccount? _currentUser;
String? _contactText;
@override
void initState() {
super.initState();
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount? account) async {
setState(() {
_currentUser = account;
});
if (_currentUser != null) {
_handleGetChannels();
}
});
_googleSignIn.signInSilently();
}
Future<void> _handleGetChannels() async {
setState(() {
_contactText = 'Loading subscription info...';
});
var httpClient = (await _googleSignIn.authenticatedClient())!;
print("hello${httpClient.credentials.accessToken}");
var youTubeApi = YouTubeApi(httpClient);
var favorites = await youTubeApi.playlistItems.list(
['snippet'],
playlistId: 'LL', // Liked List
);
print("hey $favorites");
// final youtubeApi = YouTubeApi(await _googleSignIn.authenticatedClient());
// final response = await youtubeApi.subscriptions.list('snippet', mine: true);
setState(() {
if (favorites.items!.isNotEmpty) {
final channels =
favorites.items!.map((sub) => sub.snippet!.title).join(', ');
_contactText = 'I see you follow: ${channels}!';
} else {
_contactText = 'No channels to display.';
}
});
}
Future<void> _handleSignIn() async {
try {
await _googleSignIn.signIn();
} catch (error) {
print(error);
}
}
Future<void> _handleSignOut() => _googleSignIn.disconnect();
Widget _buildBody() {
if (_currentUser != null) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
ListTile(
leading: GoogleUserCircleAvatar(
identity: _currentUser!,
),
title: Text(_currentUser!.displayName ?? ''),
subtitle: Text(_currentUser!.email),
),
const Text('Signed in successfully.'),
Text(_contactText ?? ''),
RaisedButton(
child: const Text('SIGN OUT'),
onPressed: _handleSignOut,
),
RaisedButton(
child: const Text('REFRESH'),
onPressed: _handleGetChannels,
),
],
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
const Text('You are not currently signed in.'),
RaisedButton(
child: const Text('SIGN IN'),
onPressed: _handleSignIn,
),
],
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Google Sign In'),
),
body: ConstrainedBox(
constraints: const BoxConstraints.expand(),
child: _buildBody(),
));
}
}
если я пройду ‘https://www.googleapis.com/auth/youtube.readonly» в областях он показывает только загрузку, и из областей электронной почты я получил сообщение об ошибке Unhandled Exception: Access was denied (www-authenticate header was: Bearer realm="https://accounts.google.com/", error="insufficient_scope"
, пожалуйста, помогите, я просто хочу аутентифицировать пользователя для его канала you tube.
Ответ №1:
API данных YouTube поддерживает протокол OAuth 2.0 для авторизации доступа к личным данным пользователей.
недостаточный_скоп
Означает, что отправленный вами маркер доступа не был авторизован в области, необходимой для вызываемого метода.
Например, video.insert требует авторизации в одной из следующих областей
Вам следует проверить клиентскую библиотеку Google api dart