带有 OAuth2 令牌的 AFNetworking 2.0

Posted

技术标签:

【中文标题】带有 OAuth2 令牌的 AFNetworking 2.0【英文标题】:AFNetworking 2.0 with OAuth2 tokens 【发布时间】:2014-02-28 21:50:56 【问题描述】:

我正在尝试找到一种将OAuth2(访问和刷新令牌)与AFNetworking 一起使用的方法。我很难找到关于它的好文档。

我知道AFOAuth2Client 项目,但这仅适用于AFNetworking 1.xAFNetworking2.0有什么好的解决方案吗?

另外,令牌将如何刷新?我是否应该始终检查每个请求的令牌到期情况?这究竟可以在哪里完成?或者也许在令牌过期时使用计时器,然后获取一个新的?

【问题讨论】:

【参考方案1】:

为了解决您关于令牌刷新的问题,下面是我在最近几个项目中使用的代码,用于在每个请求中检查和刷新令牌(如果需要)。

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

- (void)refreshAccessTokenWithSuccess:(APIClientSuccess)success 失败:(APIClientFailure)失败 if (self.credential == nil) 如果(失败) // 获取凭证失败 返回; 如果(!self.credential.isExpired) 如果(成功) 成功(无,无); 返回; [自我验证UsingOAuthWithURLString:kOAuthURL refreshToken:self.credential.refreshToken 成功:^(AFOAuthCredential *newCredential) // 成功! self.credential = newCredential; 如果(成功) 成功(无,无); 失败:^(NSError *错误) // 获取凭证失败 如果(失败) 失败(无,错误); ]; - (void)RefreshGET:(NSString *)URLString 参数:(NSDictionary *)参数 成功:(APIClientSuccess)成功 失败:(APIClientFailure)失败 APIClientSuccess nestedSuccess = ^(AFHTTPRequestOperation *operation, id responseObject) AFHTTPRequestOperation *thisRequestOperation = [super GET:URLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 如果(成功) 成功((AFHTTPRequestOperation *)操作,响应对象); 失败:^(AFHTTPRequestOperation *操作,NSError *错误) // 请求失败 如果(失败) 失败((AFHTTPRequestOperation *)操作,错误); ]; ; [self refreshAccessTokenWithSuccess:nestedSuccess failure:failure];

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

【讨论】:

【参考方案2】:

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

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

这些修复允许库与 AFNetworking 2.0 一起工作。甚至还有使用 CocoaPods 时如何引用它的说明。

【讨论】:

感谢您的链接。但是刷新访问令牌怎么样?是图书馆处理的吗?如果没有,那么看起来我必须为每个请求检查令牌是否过期,除非有另一种更好的方法。【参考方案3】:

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

根据您的应用程序,这可以很好地工作。我们一开始尝试了你的方法,但在我们的脑海中处理设备太多了,所以我们将它集成到我们的 API 中。我在设备上要做的就是用我们的 API 令牌添加一个 X-Authorization 标头,它永远不会改变。

可能不是您想要的答案,但至少是从与您相同的人那里获得的替代路线。

【讨论】:

【参考方案4】:

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

或 Cocoapods

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

或者你可以直接去 Gabriel 的原始 repo 并将其添加为 pod pod "GROAuth2SessionManager" , "~> 0.2"

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

【讨论】:

以上是关于带有 OAuth2 令牌的 AFNetworking 2.0的主要内容,如果未能解决你的问题,请参考以下文章

带有刷新令牌的 Spring Google OAuth2

Spring 5,401 返回后带有 Google 刷新访问令牌的 OAuth2

带有 Spring Boot REST 应用程序的 OAuth2 - 无法使用令牌访问资源

带有加密 JWT 访问令牌的 Spring Boot OAuth2

为啥带有 Netflix Zuul 反向代理的 Keycloak OAUTH2 不传递令牌

来自 GoogleAPI 的带有 JWT 的 Oauth2 令牌响应“invalid_grant”