BDBOAuth1Manager 是一个针对 AFNetworking 2.x 的 OAuth 1.0a 库。
BDBOAuth1Manager 由三个核心类组成:BDBOAuth1RequestSerializer
,BDBOAuth1RequestOperationManger
和 BDBOAuth1SessionManager
。以下是每个类的简要概述,但为了真正了解三个类的协同工作方式,请查看所包含的演示应用程序。一个是简单的 Twitter 客户端,另一个是简单的 Flickr 照片画廊,但它们展示了如何在项目中使用 BDBOAuth1Manager。
BDBOAuth1RequestOperationManger
是 AFHTTPRequestOperationManager
的子类,它提供了一组方法来简化 OAuth 1 认证流程。
@property (nonatomic) BDBOAuth1RequestSerializer *requestSerializer;
#pragma mark Initialization
- (instancetype)initWithBaseURL:(NSURL *)baseURL
consumerKey:(NSString *)consumerKey
consumerSecret:(NSString *)consumerSecret;
#pragma mark Authorization Status
@property (nonatomic, assign, readonly, getter = isAuthorized) BOOL authorized;
- (BOOL)deauthorize;
#pragma mark OAuth Handshake
- (void)fetchRequestTokenWithPath:(NSString *)requestPath
method:(NSString *)method
callbackURL:(NSURL *)callbackURL
scope:(NSString *)scope
success:(void (^)(BDBOAuth1Credential *requestToken))success
failure:(void (^)(NSError *error))failure;
- (void)fetchAccessTokenWithPath:(NSString *)accessPath
method:(NSString *)method
requestToken:(BDBOAuth1Credential *)requestToken
success:(void (^)(BDBOAuth1Credential *accessToken))success
failure:(void (^)(NSError *error))failure;
BDBOAuth1SessionManager
是 AFHTTPSessionManager
的子类,它具有与上述所描述的 BDBOAuth1RequestOperationManger
相同的 API。
如果您的部署目标是 iOS 6 或 OS X 10.8,则必须使用 BDBOAuth1RequestOperationManger
,因为 AFHTTPSessionManager
所使用的底层 NSURLSession
是 iOS 和 OS X 网络框架中针对 iOS 7 和 OS X 10.9 的新增功能。
BDBOAuth1RequestSerializer
是 AFHTTPRequestSerializer
的子类,它负责处理由 BDBOAuth1RequestOperationManger
和 BDBOAuth1SessionManager
执行的所有网络请求。这两个类自动处理此序列化器的创建,因此您无需自行实例化它。
BDBOAuth1RequestSerializer
还具有内置支持,用于在用户的密钥链中存储和检索 OAuth 访问令牌,利用服务名称区分令牌。《code>BDBOAuth1RequestOperationManger 和 BDBOAuth1SessionManager
在实例化时自动将服务名称设置为 baseURL.host(例如 api.twitter.com)。
执行 OAuth 握手的第一个步骤是为您的应用程序获取 OAuth 请求令牌。这可以通过使用 fetchRequestTokenWithPath:method:callbackURL:scope:success:failure:
方法完成。
[self.networkManager fetchRequestTokenWithPath:@"/oauth/request_token"
method:@"POST"
callbackURL:[NSURL URLWithString:@"bdboauth://request"]
scope:nil
success:^(BDBOAuth1Credential *requestToken) {
NSString *authURL = [NSString stringWithFormat:@"https://api.twitter.com/oauth/authorize?oauth_token=%@", requestToken.token];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:authURL]];
}
failure:^(NSError *error) {
NSLog(@"Error: %@", error.localizedDescription);
}];
在调用 fetchRequestTokenWithPath:method:callbackURL:scope:success:failure:
时,您必须提供一个唯一的回调 URL,其方案与您为项目目标添加的 URL 类型相对应。这允许 OAuth 提供者在用户授权后将其返回到您的应用程序。例如,如果我向我的项目添加一个方案为 bdboauth
的 URL 类型,那么我的应用程序将响应所有以 bdboauth:
开头的 URL 请求。如果我将 bdboauth://request
作为回调 URL 传递,OAuth 提供器将调用该 URL,我的应用程序将继续。
为了响应您的应用程序的 URL 方案被调用,您必须在您的应用程序代理中实现 -application:openURL:sourceApplication:annotation
方法。您可以这样做:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.scheme isEqualToString:@"bdboauth"]) {
if ([url.host isEqualToString:@"request"]) {
NSDictionary *parameters = [url dictionaryFromQueryString];
if (parameters[@"oauth_token"] && parameters[@"oauth_verifier"]) {
[self.networkManager fetchAccessTokenWithPath:@"/oauth/access_token"
method:@"POST"
requestToken:[BDBOAuth1Credential credentialWithQueryString:url.query]
success:^(BDBOAuth1Credential *accessToken) {
[self.networkManager.requestSerializer saveAccessToken:accessToken];
}];
}
}
return YES;
}
return NO;
}
BDBOAuth1Manager 是由 Bradley David Bergeron 创建的,并受到 AFOAuth1Client 的影响。AFNetworking 和 AFOAuth1Client 都是 AFNetworking 的杰出工作,而 AFNetworking 和 AFOAuth1Client 都是由 Mattt Thompson 完成。