Вход в Google не работает с YouTube - PullRequest
0 голосов
/ 26 мая 2018

Введение

Здравствуйте.Я пытаюсь разрешить своим пользователям входить в свой аккаунт YouTube через Google Sign-in.Я полностью следовал этому уроку .Кажется, как будто это работает.Но это не так.


Настройка

Я хочу, чтобы мои пользователи могли просматривать видео на YouTube с помощью кнопки.Для этого мне нужно разрешение на управление своим аккаунтом YouTube.Итак, я добавляю необходимую область, которую я нашел в документации Rate Video , предоставленной Google.Я добавляю его в AppDelegate следующим образом:

GIDSignIn.sharedInstance().scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]

Затем я нажимаю GIDSignInButton, который я добавил в свой контроллер представления, появляется страница входа в Google.Он запрашивает разрешение на доступ к моей учетной записи Google и управлению моей учетной записью YouTube.Отлично.

Screenshot of the Google Sign-In page

Я разрешаю ему управлять моим каналом YouTube, и он завершается.


Подтверждение

У меня есть UIViewController, который получает информацию о зарегистрированном канале пользователя на YouTube.Например, изображение профиля, имя и т. Д. Итак, я продолжаю UIViewController, чтобы убедиться, что я на самом деле вошел в систему, и мое приложение знает, кто я.Оно делает.Он показывает изображение профиля пользователя, имя и т. Д.


Проблема

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

@IBAction func likeButtonTapped(_ sender: Any) {
    Alamofire.request("https://www.googleapis.com/youtube/v3/videos/rate", method: .post, parameters: ["id":"9T56NNzHE7A","rating":"like","key":API_KEY], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
        print("Like Response - \(response)")

    }
}

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

Like Response - SUCCESS: {
    error =     {
        code = 401;
        errors =         (
                        {
                domain = global;
                location = Authorization;
                locationType = header;
                message = "Login Required";
                reason = required;
            }
        );
        message = "Login Required";
    };
}

Я не понимаю, почему это происходит.Я вошел в систему с правильной добавленной областью.Я пытался понять это в течение долгого времени, сейчас.Я был бы очень признателен, если бы кто-нибудь мог мне помочь!Спасибо!


Полный код

Если вам нужен мой полный код о том, как я подписываю пользователя, вот оно.Как я уже сказал, я полностью следовал этому учебнику .

Делегат приложения

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    GIDSignIn.sharedInstance().clientID = "xxxxxxxx.apps.googleusercontent.com"
    GIDSignIn.sharedInstance().delegate = self

    GIDSignIn.sharedInstance().scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]

    return true
}

@available(iOS 9.0, *)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    return GIDSignIn.sharedInstance().handle(url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:])


}

@available(iOS, introduced: 8.0, deprecated: 9.0)
func application(application: UIApplication,openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return GIDSignIn.sharedInstance().handle(url as URL!, sourceApplication: sourceApplication!, annotation: annotation)
}

SignInViewController

    @IBOutlet var signInButton: GIDSignInButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        GIDSignIn.sharedInstance().uiDelegate = self

        signInButton.style = .wide
  }


ОБНОВЛЕНИЕ

Благодаря полезному ответу Аарона Халворсена я узнал, что мне нужно заменить мой ключ API на токен входа в Google.Вот так ...

Alamofire.request("https://www.googleapis.com/youtube/v3/videos/rate", method: .post, parameters: ["access_token":userToken, "id":"9T56NNzHE7A","rating":"like"], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
            print("Like Response - \(response)")

        }

Но теперь я получаю еще одну ошибку.Вот оно:

Like Response - SUCCESS: {
    error =     {
        code = 401;
        errors =         (
                        {
                domain = global;
                location = Authorization;
                locationType = header;
                message = "Invalid Credentials";
                reason = authError;
            }
        );
        message = "Invalid Credentials";
    };
}

Я проверил accessToken.Это маркер, и это не печать.Есть идеи?

1 Ответ

0 голосов
/ 26 мая 2018

Я не уверен, что это весь ваш ответ, но при входе вы получите oauthtoken, который является вашей авторизацией, а не ключом API, попробуйте отправить ваш oauthtoken обратно с вашим запросом, я считаю, что ключ - access_token: ["access_token": OAUTH_TOKEN]

...