Учетные данные запроса API YouTube - PullRequest
0 голосов
/ 29 ноября 2018

Я создал приложение Python, использующее API Youtube (поэтому примеры приведены на Python, но это не имеет значения, концепции должны быть одинаковыми).Мне удалось заставить его работать, где я могу подключиться и сделать вызовы API.Однако, когда я подключаюсь к API, я должен определить поток, который проверяет, существует ли файл хранилища учетных данных.Если это не так, то я должен вручную войти в систему, используя поток.После входа в файл (main.py-oauth2.json) создается с токеном.Я хотел бы иметь возможность загружать учетные данные без необходимости входа вручную. Я надеялся, что есть способ сделать запрос POST для этого токена, как я видел здесь , но я былв состоянии сделать это с помощью API YouTube.Кто-нибудь знает, как реализовать желаемую функцию?

main.py

flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
    scope=YOUTUBE_UPLOAD_SCOPE,
    message=MISSING_CLIENT_SECRETS_MESSAGE)
storage = Storage(OAUTH_CREDENTIALS)

credentials = storage.get()

if credentials is None or credentials.invalid:
    # manual / UI login
    credentials = run_flow(flow, storage, args)

При попытке использовать учетную запись службы Google выдает 401 ошибку при загрузке.

credentials = Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=YOUTUBE_UPLOAD_SCOPES)

if credentials is None or credentials.expired:
    raise ValueError('Invalid credentials')

return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    credentials=credentials)
...
status, response = insert_request.next_chunk()
# <HttpError 401 "Unauthorized">

Доказательство того, что это можно сделать

Класс oauth2client.service_account.ServiceAccountCredentials используется только с учетными записями служб OAuth 2.0. Конечный пользователь не участвует в этих вызовах API сервер-сервер, поэтому вы можете создать этот объект напрямую, не используя объект Flow.

youtube api Документы о потоке Oauth

https://developers.google.com/identity/protocols/OAuth2#serviceaccount

1 Ответ

0 голосов
/ 05 декабря 2018

Проблема в том, что большинство данных YouTube являются частными данными пользователя.Поскольку это личные данные пользователя, вы должны быть аутентифицированы как пользователь, имеющий доступ к данным, чтобы получить к ним доступ.Для этого мы используем Oauth2 и входим в нашу учетную запись и получаем токен доступа и возвращаемый токен обновления.

Токен доступа можно использовать для запроса данных с Api Youtube, токен обновления можно использовать для запросановый токен доступа, когда истекает срок его действия (через час)

Обычно я бы сказал, что вам следует подумать об использовании служебной учетной записи.Учетные записи служб являются фиктивными пользователями, которые могут быть предварительно настроены на доступ к данным пользователя.К сожалению, API Youtube не поддерживает учетные записи служб.

То, что вы должны делать, и то, что я делал несколько раз в прошлом, - это аутентифицировать ваш код один раз.Получите токен обновления и сохраните его.В будущем, когда вы захотите запустить свое приложение, вы просто используете токен обновления, чтобы запросить новый токен доступа, и вы сможете получить доступ к API.Вам больше не нужно будет вручную вводить свой логин и пароль и давать согласие на доступ, все можно сделать в фоновом режиме, используя токен refesh.

Примечание. Вам нужно будет просмотреть его. В некоторых случаях срок действия маркера обновления может истечь, но вам не следует беспокоиться по большей части о том, что он хорош, если вы продолжаете использовать его регулярно.

Я не разработчик Python, но нашел это

from oauth2client import client, GOOGLE_TOKEN_URI

CLIENT_ID = "client_id"
CLIENT_SECRET = "client_secret"
REFRESH_TOKEN = "refresh_token"


credentials = client.OAuth2Credentials(
    access_token = None, 
    client_id = CLIENT_ID, 
    client_secret = CLIENT_SECRET, 
    refresh_token = REFRESH_TOKEN, 
    token_expiry = None, 
    token_uri = GOOGLE_TOKEN_URI,
    token_ id = None, 
    revoke_uri= None)

http = credentials.authorize(httplib2.Http())
...