如何在到期后使用 OAuth 2.0 以及 iOS 应用程序中的 Youtube API 获取新的访问令牌

Posted

技术标签:

【中文标题】如何在到期后使用 OAuth 2.0 以及 iOS 应用程序中的 Youtube API 获取新的访问令牌【英文标题】:How to get a new access token after expiration using OAuth 2.0 along with Youtube API in iOS application 【发布时间】:2012-12-16 21:58:09 【问题描述】:

我在我的 iPad 应用程序中使用 Youtube Api。我设法使用 OAuth 2.0 进行身份验证并获取访问令牌。 我的问题是令牌在一小时后过期,我不知道如何使用刷新令牌获取新令牌,而无需再次通过身份验证过程。 我正在使用 XCode 4.5 和 ios 5.1 & 6

【问题讨论】:

How to Refresh the token that i got from google oauth 2.0 in iOS的可能重复 我正在做类似的事情,我无法使用 OAuth 2.0 获取访问令牌,您能帮我获取 access_token 吗? 【参考方案1】:

根据documentation做@

如果您的应用程序在授权过程中获得了一个刷新令牌,那么您将需要定期使用该令牌来获得一个新的、有效的访问令牌。服务器端 Web 应用程序、已安装的应用程序和设备都获得刷新令牌。

因此,如果您已经拥有刷新令牌,则只需执行POST 请求,配置如下

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

client_id=21302922996.apps.googleusercontent.com&
client_secret=<YOUR CLIENT SECRET>
refresh_token=<YOUR REFRESH TOKEN>
grant_type=refresh_token

你会收到类似的回复


  "access_token":<A NEW ACCESS TOKEN>,
  "expires_in":<AN EXPIRING TIME>,
  "token_type":"Bearer"

【讨论】:

+Gabriele 我也试过了:你能看看这个post 我会看看,但复制你自己的问题不是一个好习惯 它不是重复的!第一个是了解如何使用 POST 请求刷新它的正确方法。这个是关于整个方法的..所以不要混淆! 这肯定不仅仅是相关的。下次编辑您的原始问题。【参考方案2】:

以下是使用 AFNetworking 刷新 accessToken 以发出请求的完整代码:

NSString *refreshToken = <YOUR_REFRESH_TOKEN>;

NSString *post = [NSString stringWithFormat:@"client_secret=%@&grant_type=refresh_token&refresh_token=%@&client_id=%@",kYouTubeClientSecret,refreshToken,kYouTubeClientID];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSURL *url = [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/token"];

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

AFHTTPRequestOperation *httpRequest = [httpClient HTTPRequestOperationWithRequest:request
                                                                          success:^(AFHTTPRequestOperation *operation, id responseObject) 
                                                                              NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
                                                                              NSString *newAccessToken = json[@"access_token"];
                                                                              NSLog(@"received new accessToken = %@",newAccessToken);

                                                                              // store accessToken here

                                                                           failure:^(AFHTTPRequestOperation *operation, NSError *error) 
                                                                              NSLog(@"error refreshing token: %@",[error localizedDescription]);

                                                                          ];
[httpClient enqueueHTTPRequestOperation:httpRequest];

【讨论】:

感谢您,解决了 2 小时的问题!我最初使用字典来创建参数并将其作为正文传递。但是给了我错误,即未设置grant_type。您使用带有连接参数的 NSString 的方法就是解决它的原因。

以上是关于如何在到期后使用 OAuth 2.0 以及 iOS 应用程序中的 Youtube API 获取新的访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

通过第三方服务授权后,如何使用 OAuth 2.0 保持会话? [关闭]

iOS 中的 OAuth 2.0 集成

如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录

如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录

Uber 在 ios Swift 中提供了无效的 OAuth 2.0 凭据

记一次ios使用OAuth 2.0写的接口获取token的小错