AFNetworking 2.0与OAuth2令牌

4

我正在尝试找到一种使用OAuth2(访问和刷新令牌)与AFNetworking结合使用的方法。在这方面,我很难找到好的文档。

我知道有AFOAuth2Client项目,但它只适用于AFNetworking1.x版本。是否有适用于AFNetworking2.0的好解决方案?

此外,令牌将如何被刷新?我必须始终检查每个请求的令牌到期时间吗?在哪里可以进行检查?或者使用计时器来定期获取新的令牌?

4个回答

1
为了回答您有关令牌刷新的问题,以下是我在最近几个项目中使用的代码,用于检查和刷新令牌(如果需要)以在每个请求时使用。
基本上,它只是将请求块传递给一个方法来进行令牌检查,然后在令牌良好或令牌刷新后立即运行该块。
- (void)refreshAccessTokenWithSuccess:(APIClientSuccess)success
                              failure:(APIClientFailure)failure {
    if (self.credential == nil) {
        if (failure) {
            // 无法获取凭证
        }
        return;
    }
    if (!self.credential.isExpired) {
        if (success) {
            success(nil, nil);
        }
        return;
    }
    [self authenticateUsingOAuthWithURLString:kOAuthURL
                            refreshToken:self.credential.refreshToken
                                 success:^(AFOAuthCredential *newCredential) {
                                     // 成功!
                                     self.credential = newCredential;
                                     if (success) {
                                         success(nil, nil);
                                     }
                                 }
                                 failure:^(NSError *error) {
                                     // 无法获取凭证
                                     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) {
            // 请求失败
            if (failure) {
                failure((AFHTTPRequestOperation *)operation, error);
            }
        }];
    };
    [self refreshAccessTokenWithSuccess:nestedSuccess failure:failure];
}

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


0

这可能不是你想要的,但这是我的公司处理它的方式。我们为我们的项目使用API,因此我们将GMail OAuth信息交给我们的API,然后它返回给我们一个API令牌。我们让API处理令牌/过期令牌。

根据您的应用程序,这可能非常有效。我们起初尝试了您的方法,在设备上处理起来太麻烦了,因此我们将其集成到了我们的API中。我在设备上所要做的就是添加一个X-Authorization头,其中包含我们的API令牌,该令牌永远不会更改。

也许不是你想要的答案,但至少是一个替代路线,来自一个曾经身处你鞋子的人。


0

谢谢提供链接。但是如何更新访问令牌呢?库是否处理这个问题?如果没有,那么看起来我需要检查每个请求的令牌有效期,除非有其他更好的方法。 - RedRoses

0

我fork了一个非常棒的AFOAuth2Client重写版(由Gabriel Rinaldi编写)适用于AFNetworking 2.0,并进行了一些更改以满足我的需求(公开responseObject并接受无效的SSL证书)。目前正在等待pull request(虽然它们不是那么常见,所以我不指望它们会被接受)。您可以通过GitHub获取我的版本

或者使用Cocoapods

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

或者您可以直接转到Gabriel的原始存储库并将其添加为pod pod "GROAuth2SessionManager" , "~> 0.2".

我意识到这并没有回答您关于令牌刷新的第二个问题。我在项目中还没有走得那么远,所以我不能确定它是否会刷新,但我想您很快就能找出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接