【问题标题】:Google API - Invalid CredentialsGoogle API - 凭据无效
【发布时间】: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


【解决方案1】:

尝试将访问令牌添加到 Alamofire 请求的标头中,而不是将其作为参数传递。因此:

let headers: HTTPHeaders = ["Authorization": "Bearer \(token)"]
let request = Alamofire.request(path, method: method, parameters: parameters, encoding: JSONEncoding.default, headers: headers)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多