如何从 Google YouTube Data API OAuth 2 iOS 获取刷新令牌

Posted

技术标签:

【中文标题】如何从 Google YouTube Data API OAuth 2 iOS 获取刷新令牌【英文标题】:How to get a refresh token from Google YouTube Data API OAuth 2 iOS 【发布时间】:2017-03-30 05:25:30 【问题描述】:

我正在使用OAuthSwift pod 进行 Google API 身份验证。在回调中,缺少刷新令牌。由于谷歌返回500 Server Error,当用户已经通过身份验证后尝试请求新令牌时,我想存储刷新令牌,并在用户下次登录时授权,并检索新令牌。

这是我的代码:

           let callback = "\(Bundle.main.bundleIdentifier ?? ""):/oauth2Callback"
            _ = ytOAuth2Swift?.authorize(
                withCallbackURL: URL(string: callback)!,
                scope: "https://www.googleapis.com/auth/youtube", state: state,
                success:  credential, response, parameters in

                   print("YouTube Access_Token \(credential.oauthToken)")
                    print("YouTube efreshR_Token \(credential.oauthRefreshToken)")
                ,
                failure:  error in
                    print("ERROR: \(error.localizedDescription)")
            
            )

这是我们得到的回复!

根据 Google API 文档,这是应该进来的响应:


   "access_token":"1/fFAGRNJru1FTz70BzhT3Zg",
   "expires_in":3920,
   "token_type":"Bearer",
   "refresh_token":"1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"

我尝试使用嵌入式WebView 不走运:

[

【问题讨论】:

【参考方案1】:

看起来 google API 一开始就给了你一次刷新令牌,而新的请求不再给它了。如果是,您应该知道 refresh_token 仅在第一次授权时提供,因此如果您授权多次,它可能不会再次返回 refresh_token。请尝试以下说明:

转到您的帐户安全设置:https://www.google.com/settings/u/1/security。 点击“授权应用程序和网站”旁边的编辑按钮。 然后点击您的应用旁边的“撤消访问权限”。

在它之后你的下一个调用也应该返回一个 refresh_token

可能有点不同,因为我的面板中没有使用英语。当我使用谷歌的 refresh_token 时,它永不过期,你可以永远使用它来创建新的 access_tokens。

另一种解决方案

如果它不起作用,请尝试在您的代码中将 access_type 设置为离线(我认为最简单的方法是在您的 API url 中添加一个 GET 参数作为access_type=offline)。

查询中也可能是prompt=consent。它将强制用户授权,然后应该返回 refresh_token

更多信息可以在Google Documentation: Oauth2找到

提示

Google API 的好处是 refresh_token 永远不会过期,直到您不会撤销它或创建一个新的。因此,您甚至可以对其进行硬编码,并在每次想要获得新的 access_token 时使用。

【讨论】:

嗨@Karol,谢谢你的精彩回答。恐怕我唯一可以发展的方法就是继续撤销访问权限,否则它甚至不会给我access_token :D。我会试试access_type=offline 让你知道 欢迎您 :) 无论如何请记住 Google 的 refresh_token 永不过期,因此您可以使用它来获取任意数量的 access_token。 嗨@Karol,在撤销,甚至创建一个新的谷歌应用程序后,API 只返回 3 个参数,不包括refresh_token,有什么建议吗?非常感谢 奇怪。总是必须有access_type=offline 并在查询中添加prompt=consent。它将强制用户授权,然后应该返回refresh_token 你是救生员@Karol !,access_type 是问题所在......我已经为此烦恼了很久:D.. 如果你有时间帮助一对夫妇更多问题,那真是太棒了! ;),我正在尝试对 Instagram 进行身份验证,1)如何设置 HTTP URI 回调方案***.com/questions/40624790/… 2),如何在回调中获取刷新令牌。 ***.com/questions/40591821/…

以上是关于如何从 Google YouTube Data API OAuth 2 iOS 获取刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

Youtube Data Studio,如何从两个不同的数据源(例如两个 BigQuery 表)创建计算字段

如何使用 YouTube Data API v3 更改页面结果

如何通过 YouTube Data API v3 从我自己的 YouTube 频道获取所有视频

使用 Youtube Data API V3 和 Google API Client PHP 将视频上传到 Youtube - 获取 401(未经授权)消息

如何从 YouTube 频道 ID 获取用户的 Google+ ID

Youtube Data API V3 - 使用google.youtube.videos.list()获取视频时出错