我已创建自己的OAuth2客户端以连接到Google API(特别是YouTube)。所有这些都在我第一次授权时按预期工作:
POST
,https://accounts.google.com/o/oauth2/auth
等进行response_type=code
到redirect_uri=urn:ietf:wg:oauth:2.0:oob
POST
发送到https://accounts.google.com/o/oauth2/token
但是,我有一个签到按钮,这就是问题发生的地方;这基本上将我在我的应用程序中存储的access_token
和refresh_token
设置回nil
,只是这样:
- (void)clearCredentials
{
_accessToken = nil;
_refreshToken = nil;
_tokenExpirationDate = nil;
}
当我想再次登录时,我调用与以前相同的授权方法,所有参数都像第一次一样正确设置。
但是,在浏览登录对话框时,我没有获得允许应用程序访问youtube帐户的页面,因此也无法获取我可以从页面标题中获取授权代码的页面。相反,它会向我显示一个错误页面(invalid_request
),表示我未能提供response_type
。
我也尝试撤销access_token
。撤销按预期工作,但经授权后,我仍然无法获得用户可以再次批准权限的页面。
任何人都有一个线索可以指出我正确的方向?我怎么能这样做?
答案 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];
}