您好。我试图允许我的用户通过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帐户的权限。完美。
我允许它管理我的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。这是令牌,它不打印可选。有什么想法吗?
答案 0 :(得分:0)
我不确定这是否是您的完整答案,但是当您登录时,我会得到一个oauthtoken back,这是您的授权,而不是api密钥尝试将您的oauthtoken带回您的请求,我相信关键是access_token:[" access_token":OAUTH_TOKEN]