【发布时间】:2018-11-07 02:29:10
【问题描述】:
我正在尝试制作一个 iOS 应用程序,用户可以在其中使用 YouTube API 对 YouTube 视频进行评分。为此,必须对用户进行身份验证。所以,我使用谷歌的Google Sign-In 来验证我的用户。我关注了implementation guide,似乎用户已登录。我可以访问用户的数据,例如他们的个人资料图片、姓名等。
因为我使用的是YouTube API,所以我需要在用户登录之前将 YouTube 范围添加到 Google Sign-In。所以,我这样做......
GIDSignIn.sharedInstance().scopes = ["https://www.googleapis.com/auth/youtube"]
现在,只要用户登录,它就会请求访问他们的 YouTube 频道。
似乎一切都运行良好。但是,现在要评价 YouTube 视频。您可以查看Google's documentation on how to rate a YouTube video,但基本上,这是我必须做的。
Alamofire.request("https://www.googleapis.com/youtube/v3/videos/rate", method: .post, parameters: ["access_token":token, "id":"9T56NNzHE7A","rating":"like"], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
print("\(response)")
}
现在因为这需要身份验证,所以 API 需要一个访问令牌。所以(如您在上面看到的)我给 API 提供了谷歌登录给我的访问令牌。即:
let token = GIDSignIn.sharedInstance().currentUser.authentication.accessToken!
但是,请求不起作用。我得到的回应是
SUCCESS: {
error = {
code = 401;
errors = (
{
domain = global;
location = Authorization;
locationType = header;
message = "Invalid Credentials";
reason = authError;
}
);
message = "Invalid Credentials";
};
}
我不明白如果用户仅在几秒钟前登录,凭据会如何无效。如果有帮助,这里是我的访问令牌的示例(不要担心这实际上不是它):
ve35.LmaIBHsK3dUPNR34rb0fgThwiZj-dNB7k935EhyVK1X8nkgMBmA-_3Hxhys7uk-HEm3ggg-HIgJv83RHXhGNKdVkWn0sEn7XtaWhTbeVjg8hsBK3hK8H1Gx8KzhhaEJGVg
我一直在互联网上寻找答案,但无济于事。所以我决定问问。有谁知道如何解决这个问题?任何意见将不胜感激!
【问题讨论】:
-
我很确定访问令牌需要按照 OAuth2 协议添加到标头中,而不是作为参数传递。见:developers.google.com/youtube/v3/guides/authentication
-
我不是 ios 开发人员,但您可以将访问权作为 reeust 的一部分传递给您,只需添加它 &access_token=XXX 或将其作为身份验证标头承载令牌发送。但是,错误消息让我认为您发送的访问令牌有问题,您是否 100% 确定您保存了最新的并且没有使用旧的。
-
@DaImTo 我不知道这是可能的。
-
@JacobCavin Alamofire 有
HTTPHeaders类型别名,它只是一个[String:String]字典,所以你可以直接执行let headers: HTTPHeaders = ["Authorization": "Bearer \(token)"]然后传递给 Alamofire 请求。 -
跟进我之前的评论:
let request = Alamofire.request(path, method: method, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
标签: swift oauth google-api youtube-api google-signin