Google登录不与YouTube合作

时间:2018-05-26 16:01:31

标签: swift youtube-api google-signin youtube-data-api

简介

您好。我试图允许我的用户通过Google登录登录他们的YouTube帐户。我完全遵循了这个tutorial。看起来好像在起作用。但是,它不是。

设置

我希望我的用户能够通过按下按钮来欣赏YouTube视频。为此,我需要获得管理其YouTube帐户的权限。因此,我添加了我在Google提供的Rate Video documentation中找到的范围。我将它添加到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";
    };
}

我不明白为什么会这样。我已经添加了正确的范围登录。现在,我已经试图解决这个问题很长一段时间了。如果有人能帮助我,我会非常感激!谢谢!

完整代码

如果你需要查看关于我如何签署用户的完整代码,请点击此处。就像我说的那样,我完全遵循了这个tutorial

应用代表

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
  }

更新

感谢Aaron Halvorsen提供的有用答案,我了解到我需要使用Google登录访问令牌替换我的API密钥。像这样......

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 :(得分:0)

我不确定这是否是您的完整答案,但是当您登录时,我会得到一个oauthtoken back,这是您的授权,而不是api密钥尝试将您的oauthtoken带回您的请求,我相信关键是access_token:[" access_token":OAUTH_TOKEN]