YouTube OAuth2授权在重新授权时失败

时间:2014-01-07 16:00:59

标签: ios iphone youtube oauth-2.0 google-oauth

我已创建自己的OAuth2客户端以连接到Google API(特别是YouTube)。所有这些都在我第一次授权时按预期工作:

  • 我使用适当的参数POSThttps://accounts.google.com/o/oauth2/auth等进行response_type=coderedirect_uri=urn:ietf:wg:oauth:2.0:oob
  • 我在UIWebView中处理响应,让用户通过登录对话框
  • 我从最后一页的标题中获取请求令牌所需的授权码
  • 我将令牌请求POST发送到https://accounts.google.com/o/oauth2/token
  • 我得到了access_token和refresh_token以及我存储在我的应用程序中的

但是,我有一个签到按钮,这就是问题发生的地方;这基本上将我在我的应用程序中存储的access_tokenrefresh_token设置回nil,只是这样:

- (void)clearCredentials
{
    _accessToken = nil;
    _refreshToken = nil;
    _tokenExpirationDate = nil;
}

当我想再次登录时,我调用与以前相同的授权方法,所有参数都像第一次一样正确设置。 但是,在浏览登录对话框时,我没有获得允许应用程序访问youtube帐户的页面,因此也无法获取我可以从页面标题中获取授权代码的页面。相反,它会向我显示一个错误页面(invalid_request),表示我未能提供response_type

我也尝试撤销access_token。撤销按预期工作,但经授权后,我仍然无法获得用户可以再次批准权限的页面。

任何人都有一个线索可以指出我正确的方向?我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

我真的认为不应该使用UIWebView。它强制用户输入密码(和OTP为2因素)和糟糕的用户体验,从安全的角度来看是坏的。您可以重定向到Safari浏览器并获取令牌 https://plus.google.com/+NaveenAgarwal/posts/AztHNnQh7w6

或使用Google+ SDK。它会重定向到现有的Google应用程序或浏览器中,并为您提供令牌。

答案 1 :(得分:0)

事实证明,与UIWebView存储的Cookie存在问题。 使用https://accounts.google.com/o/oauth2/approval删除Cookie存储区中的Cookie,因为网址解析了它。

以下是我从页面标题中获取授权码后用于删除相应Cookie的简化代码:

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

NSArray *cookies = [storage cookiesForURL:[[_webView request] URL]];

for (NSHTTPCookie *cookie in cookies)
{
    [storage deleteCookie:cookie];
}