AFNetworking 2.0与OAuth2令牌

时间:2014-02-28 21:50:56

标签: ios oauth-2.0 afnetworking-2

我正在尝试使用OAuth2找到一种方法来使用AFNetworking(访问和刷新令牌)。我很难找到好文件。

我了解AFOAuth2Client项目,但这只适用于AFNetworking 1.xAFNetworking 2.0有什么好的解决方案吗?

此外,令牌究竟会如何刷新?我应该总是检查每个请求的令牌到期吗?这究竟可以在哪里完成?或者可能在令牌过期时使用计时器,然后获取一个新计时器?

4 个答案:

答案 0 :(得分:1)

要解决有关令牌刷新的问题,下面是我在上几个项目中使用的代码,以便在每个请求时检查并刷新令牌(如果需要)。

基本上,它只是将请求块传递给一个方法来进行令牌检查,然后在令牌好或刷新令牌后立即运行块。

- (void)refreshAccessTokenWithSuccess:(APIClientSuccess)success
                              failure:(APIClientFailure)failure {
    if (self.credential == nil) {
        if (failure) {
            // Failed to get credentials
        }
        return;
    }
    if (!self.credential.isExpired) {
        if (success) {
            success(nil, nil);
        }
        return;
    }
    [self authenticateUsingOAuthWithURLString:kOAuthURL
                            refreshToken:self.credential.refreshToken
                                 success:^(AFOAuthCredential *newCredential) {
                                     // SUCCESS!
                                     self.credential = newCredential;
                                     if (success) {
                                         success(nil, nil);
                                     }
                                 }
                                 failure:^(NSError *error) {
                                     // Failed to get credentials
                                     if (failure) {
                                         failure(nil, error);
                                     }
                                 }];
}
- (void)RefreshGET:(NSString *)URLString
 parameters:(NSDictionary *)parameters
    success:(APIClientSuccess)success
    failure:(APIClientFailure)failure
{
    APIClientSuccess nestedSuccess  = ^(AFHTTPRequestOperation *operation, id responseObject) {
        AFHTTPRequestOperation *thisRequestOperation = [super GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
            if (success) {
                success((AFHTTPRequestOperation *)operation, responseObject);
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            // Failed request
            if (failure) {
                failure((AFHTTPRequestOperation *)operation, error);
            }
        }];
    };
    [self refreshAccessTokenWithSuccess:nestedSuccess failure:failure];
}

如果您想查看整个APIClient课程,请告诉我。

答案 1 :(得分:0)

这可能不是您所寻求的,但这就是我公司处理它的方式。我们为项目使用API​​,因此我们将GMail OAuth信息移交给我们的API,然后它返回API的令牌。我们让API处理令牌/过期令牌。

根据您的应用程序,这可以很好地工作。我们首先尝试了您的方法,但我们在设备上处理的内容太多了,因此我们将其集成到了API中。我在设备上所要做的就是添加一个X-Authorization标头,我们的API标记永远不会改变。

可能不是你想要的答案,至少是你穿着的人的替代路线。

答案 2 :(得分:0)

AFOAuth2Client的分支支持AFNetworking 2.0。看看这个讨论:

  

https://github.com/AFNetworking/AFOAuth2Client/pull/55#commits-pushed-5ed7a6e

这些修补程序允许库与AFNetworking 2.0一起使用。甚至还有关于在使用CocoaPods时如何引用它的说明。

答案 3 :(得分:0)

我为AFNetworking 2.0分配了一个非常棒的AFOAuth2Client重写(由Gabriel Rinaldi编写)并进行了一些更改以满足我的需求(公开responseObject并接受无效的SSL证书)。目前正在等待拉取请求(因为他们并不常见,所以我不希望它们被接受)。您可以通过GitHub

获取我的版本

或Cocoapods

pod 'GROAuth2Client', :git => 'https://github.com/nicktmro/GROAuth2SessionManager'

或者您可以访问Gabriel的原始回购并将其添加为广告pod "GROAuth2SessionManager" , "~> 0.2"

我意识到这并没有回答关于刷新令牌的问题的第二部分。我在我的项目中并没有那么远,所以我无法肯定地告诉你,但我想你可以很快发现它是否会更新。