Как аутентифицировать пользователя для загрузки видео в YouTube-канале flutter?

#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