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

时间:2016-11-16 05:49:55

标签: ios oauth google-api youtube-data-api

我正在使用OAuthSwift pod进行Google API身份验证。在回调中,缺少刷新令牌。当Google返回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)")
            }
            )

这是我们回复的回复!

Response Parameters

根据Google API文档,这是应该出现的响应:

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

我尝试使用嵌入式WebView没有运气:

[mbedded WebView error messageE[2]

1 个答案:

答案 0 :(得分:2)

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

之后你下次打电话也应该返回一个refresh_token

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

另一种解决方案

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

在查询中可能还需要prompt=consent。它将强制用户进行授权,然后应返回refresh_token

可以在Google Documentation: Oauth2

中找到更多信息

提示

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