BDBOAuth1Manager 2.0.0

BDBOAuth1Manager 2.0.0

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布最新发布2015年12月

Bradley David Bergeron维护。



BDBOAuth1Manager 是一个针对 AFNetworking 2.x 的 OAuth 1.0a 库。

用法

BDBOAuth1Manager 由三个核心类组成:BDBOAuth1RequestSerializerBDBOAuth1RequestOperationMangerBDBOAuth1SessionManager。以下是每个类的简要概述,但为了真正了解三个类的协同工作方式,请查看所包含的演示应用程序。一个是简单的 Twitter 客户端,另一个是简单的 Flickr 照片画廊,但它们展示了如何在项目中使用 BDBOAuth1Manager。

BDBOAuth1RequestOperationManger

BDBOAuth1RequestOperationMangerAFHTTPRequestOperationManager 的子类,它提供了一组方法来简化 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

BDBOAuth1SessionManagerAFHTTPSessionManager 的子类,它具有与上述所描述的 BDBOAuth1RequestOperationManger 相同的 API。

如果您的部署目标是 iOS 6 或 OS X 10.8,则必须使用 BDBOAuth1RequestOperationManger,因为 AFHTTPSessionManager 所使用的底层 NSURLSession 是 iOS 和 OS X 网络框架中针对 iOS 7 和 OS X 10.9 的新增功能。

BDBOAuth1RequestSerializer

BDBOAuth1RequestSerializerAFHTTPRequestSerializer 的子类,它负责处理由 BDBOAuth1RequestOperationMangerBDBOAuth1SessionManager 执行的所有网络请求。这两个类自动处理此序列化器的创建,因此您无需自行实例化它。

BDBOAuth1RequestSerializer 还具有内置支持,用于在用户的密钥链中存储和检索 OAuth 访问令牌,利用服务名称区分令牌。《code>BDBOAuth1RequestOperationManger 和 BDBOAuth1SessionManager 在实例化时自动将服务名称设置为 baseURL.host(例如 api.twitter.com)。

OAuth 握手

执行 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);
                                       }];

为 OAuth 回调创建 URL 类型

在调用 fetchRequestTokenWithPath:method:callbackURL:scope:success:failure: 时,您必须提供一个唯一的回调 URL,其方案与您为项目目标添加的 URL 类型相对应。这允许 OAuth 提供者在用户授权后将其返回到您的应用程序。例如,如果我向我的项目添加一个方案为 bdboauth 的 URL 类型,那么我的应用程序将响应所有以 bdboauth: 开头的 URL 请求。如果我将 bdboauth://request 作为回调 URL 传递,OAuth 提供器将调用该 URL,我的应用程序将继续。

URL Types Screenshot

响应 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 完成。