Как исправить ошибку 401 с запросами API YouTube?

[Проблема решена, я просто пока не могу выбрать свой ответ в качестве решения.]

Я работаю над функцией загрузки видео для мобильного приложения с API данных YouTube; но у меня по-прежнему возникает ошибка 401 при выполнении запроса.

Я использую Firebase для предоставления ключей OAuth и API от Google Developer.


Я попытался посмотреть, претерпел ли файл PLIST, предоставленный Firebase, какие-либо изменения, и даже с другим.

Я попытался сбросить iOS Simulator, удалить приложение и отменить разрешения моей учетной записи для приложения через GIDSignIn.sharedInstance().disconnect().

Я пытался разобраться с другими вопросами StackOverFlow, но все они касались других языков или даже «сырых» HTTP-запросов.


В моем файле AppDelegate у меня есть эти строки для соединения с Firebase и Google:

FirebaseApp.configure()
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID

и этот метод (и очень похожий, который я не буду здесь показывать):

func application( _ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any ) -> Bool {
        return GIDSignIn.sharedInstance().handle( url,
                sourceApplication: sourceApplication,
                annotation: annotation )
}

В моем классе, связанном с контроллером, у меня есть эти методы для создания запроса:

private func uploadVideo( withVideoObject video: GTLRYouTube_Video, resumeUploadLocationURL locationURL: URL? ) throws {
    let query = try uploadQuery( _video: video, resumeUploadLocationURL: locationURL )!

    // [ progress related feedback ]

    YouTubeUploadController.uploadFileTicket = self.service.executeQuery( query,
            delegate: self.controller!,
            didFinish: #selector( self.controller!.displayResultWithTicket(ticket:finishedWithObject:error:) ) )
}
private func uploadQuery( _video: GTLRYouTube_Video, resumeUploadLocationURL locationURL: URL? ) throws -> GTLRYouTubeQuery_VideosInsert? {
    let fileToUploadURL = URL( fileURLWithPath: "\(self.controller!.uploadPathField)" )
    if !( try! fileToUploadURL.checkPromisedItemIsReachable() ) {
        throw YouTubeCustomError.init( _kind: .fileNotFound )
    }
    // Get a file handle for the upload data.
    let uploadParameters = prepareUploadParameters( fileToUploadURL: fileToUploadURL, locationURL: locationURL )

    return GTLRYouTubeQuery_VideosInsert.query( withObject: _video, part: "snippet,status", uploadParameters: uploadParameters )
}

Он отправляет ошибку через displayResultWithTicket(ticket:finishedWithObject:error:):
"Эта операция не может быть завершена. (ошибка com.google.HTTPStatus 401.)"

Не указано ни причины сбоя, ни предложения по восстановлению.

Заранее спасибо.


Текст ответа:
Вот журналы HTTP-ответов GTMSessionFetcher для попытки загрузки:

Response body: (178 bytes)
{
  "error" : {
    "message" : "Login Required",
    "errors" : [
      {
        "message" : "Login Required",
        "locationType" : "header",
        "reason" : "required",
        "domain" : "global",
        "location" : "Authorization"
      }
    ],
    "code" : 401
  }
}

Заголовки запроса

Request: POST https://www.googleapis.com/resumable/upload/youtube/v3/videos?part=snippet%2Cstatus&prettyPrint=false
Request headers:
  Accept: application/json
  Cache-Control: no-cache
  Content-Type: application/json; charset=utf-8
  User-Agent: org.cocoapods.GoogleAPIClientForREST/1.3.8 google-api-objc-client/3.0 iPhone/12.2 hw/sim (gzip) (GTMSUF/1)
  X-Goog-Upload-Command: start
  X-Goog-Upload-Content-Length: 2614231
  X-Goog-Upload-Content-Type: video/mp4
  X-Goog-Upload-Protocol: resumable

Не могли бы вы попробовать включить ведение журнала HTTP, чтобы мы могли видеть ответ API в формате JSON?

stvar 03.06.2019 22:53

@stvar отредактировано! Спасибо за предложение ?

Prometheos II 04.06.2019 16:37

Согласно документы, ваша попытка входа в систему не удалась. Не могли бы вы также проверить/опубликовать из журналов инициирующий заголовок HTTP (редактируя любые данные учетных данных!)

stvar 04.06.2019 17:02

Я не уверен, что вы имеете в виду... HTTP-запрос? Кроме того, я не нахожу никаких учетных данных, это из-за POST или я что-то пропустил? ?

Prometheos II 04.06.2019 17:26

Вы знаете, где я должен ввести эти учетные данные?

Prometheos II 04.06.2019 17:26

Возьмем, к примеру, заголовки запросов, показанный здесь. Подозреваю, что у вас нет нужной формы Заголовок HTTP-запросаAuthorization: Bearer ACCESS_TOKEN

stvar 04.06.2019 17:36

Я думаю, что ответ это поможет.

stvar 04.06.2019 17:44

Кажется, я нашел другое решение. Если это сработает, я создам ответ; но я не хочу красть у вас кредит, пока вы мне помогали, поэтому я разрешаю вам публиковать свои ответы, если хотите ?

Prometheos II 04.06.2019 20:49

Совершенно никаких проблем. Идите вперед и опубликуйте свое решение, если оно уже протестировано.

stvar 04.06.2019 22:18

Спасибо. Хорошего дня.

Prometheos II 04.06.2019 22:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
766
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так что в моем случае мне не хватало влияния авторизатора GTRLService в моем методе входа GIDSignInDelegate:
service.authorizer = user.authentication.fetcherAuthorizer()

Я предполагаю, что это можно сделать и другими методами, но это основная точка, в которой он инициализируется.


Я сделал это с помощью средства доступа записи ObjC, потому что не нашел пути к создать/получить экземпляр GTRLService в Swift и использовал одноэлементный класс ObjC для его получения, и я не был уверен, сможем ли мы получить доступ к методам экземпляра GTRLService в Swift, если он был инициализирован в ObjC. .

+ (void)setSharedInstanceAuthorizer:(id <GTMFetcherAuthorizationProtocol>)_authorizer {
    if (sharedInstance == nil) {
        sharedInstance = [GTLRYouTubeService new];
    }
    sharedInstance.authorizer = _authorizer;
};

Если это не решит проблему, то могут помочь ответы @stvar в комментариях к вопросу.

Спасибо, что поделились ответом. Но теперь у GTLRYouTubeService больше нет authorizer собственности. Тогда как я могу решить эту проблему? Пожалуйста, дайте мне знать. Спасибо

doori 22.06.2021 04:02

Другие вопросы по теме