2014-04-15 24 views
5

phiên bản ngắn:Cách sử dụng mã thông báo truy cập ngoại tuyến của Google để xác thực trong nền trên iOS?

Tôi muốn sử dụng Google OAuth2 client for Objective C để tạo ra một đối tượng hợp lệ GTMOAuth2Authentication cho tôi để sử dụng trong các ứng dụng của tôi, với một access token ẩn tôi nhận được từ backend của tôi. Làm thế nào tôi có thể thực hiện điều đó?

tình hình của tôi:

ứng dụng của tôi sử dụng Analytics read-only phạm vi để có được một số dữ liệu về trang web của người dùng (s). Cách tôi thực hiện điều này, là bằng cách đăng nhập bằng ViewController GTMOAuth2ViewControllerTouch, được cung cấp bởi ứng dụng khách Google OAuth2 cho Mục tiêu C. Sau đó, nó cung cấp cho tôi đối tượng GTMOAuth2Authentication hợp lệ mà tôi có thể sử dụng để truy vấn Google Analytics qua Google API client.

Bây giờ, chúng tôi không muốn cấp cho người dùng quyền truy cập Google Analytics (một số không có tài khoản Google và nói chung, chúng tôi muốn giữ thông tin đơn giản qua ứng dụng). Điều này có nghĩa là chúng tôi phải đăng nhập bằng tài khoản của mình (có quyền truy cập vào tất cả dữ liệu Analytics của trang web). Rõ ràng chúng tôi không thể cung cấp cho người dùng thông tin đăng nhập của mình, vì vậy chúng tôi phải tìm ra giải pháp cho điều đó.

Kế hoạch của tôi:

Tôi nghĩ rằng vấn đề này có thể được giải quyết bằng cách yêu cầu (truy cập offline) chuỗi dấu hiệu của chúng tôi từ backend của chúng tôi (thông qua mã hóa SSL), lưu nó vào keychain của người dùng và sử dụng nó hơn nữa trong ứng dụng để truy vấn Analytics. Sau đó, chúng tôi cho phép người dùng đăng nhập vào dịch vụ của chúng tôi (để chúng tôi có thể xác định những trang web mà người dùng có quyền truy cập) và hiển thị dữ liệu.

Vấn đề của tôi:

Tôi đã tìm kiếm khắp nơi, nhìn qua (rất mỏng) tài liệu của Google, kiểm tra mã nguồn GTMOAuth2Authentication, nhưng tôi dường như không thể quấn quanh đầu tôi vấn đề. Dường như với tôi sẽ có một giải pháp như thế này (bởi vì tôi sử dụng một cách tiếp cận tương tự trong CMS của chúng tôi để cho phép người dùng đăng lên tường Facebook của chúng tôi), vậy tôi đang thiếu gì ở đây?

Mã đăng nhập hiện tại:

GTMOAuth2ViewControllerTouch *viewController = [[GTMOAuth2ViewControllerTouch alloc] 
                initWithScope:scope 
                clientID:kMyClientID 
                clientSecret:kMyClientSecret 
                keychainItemName:kKeychainItemName 
                completionHandler: 
    ^(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error) { 
     if (error != nil) { 
      // Authentication failed 
      DebugLog(@"Failed!"); 
     } else { 
      // Authentication succeeded 
      DebugLog(@"Success!"); 

      // Update interface 
      self.loginButton.hidden = YES; 

      self.authentication = auth; 
     } 
    }]; 

Những gì tôi đã cố gắng:

Tôi đã thử bằng tay tạo ra một đối tượng GTMOAuth2Authentication và cài đặt tất cả các thông số bản thân mình (phạm vi, ClientID, secretid, mã thông báo truy cập, mã thông báo làm mới, callbackuri, mã thông báo url, v.v.), nhưng tôi được trả lại lỗi 401: Lỗi bắt buộc khi tôi cố gắng sử dụng đối tượng cho truy vấn. Vì vậy, tôi đoán đó không phải là cách để làm điều đó.

Links:

Thanks for reading!

+0

thử và lấy dự án mẫu cho Google Drive. Nó có mã Oauth trong đó. Khi bạn hiểu cách hoạt động, bạn sẽ có thể chỉnh sửa nó cho API bạn đang sử dụng. http://code.google.com/p/google-api-objectivec-client/source/browse/#svn%2Ftrunk%2FExamples%2FDriveSample – DaImTo

+0

Cảm ơn bạn đã đề xuất! Tôi sẽ kiểm tra nó ra – Thermometer

+0

Tôi đã không nhìn vào Objective-c trong 100 năm. Nhưng tôi có thể giúp đỡ nếu bạn gặp khó khăn chỉ cần đăng lại ở đây. Tôi vẫn có thể đọc nó ít nhất tôi có thể cung cấp cho bạn những gợi ý về những gì cần làm. – DaImTo

Trả lời

5

Bạn không cần một phiên bản GTMOAuth2Authentication. Những gì bạn cần là tạo lớp học của riêng bạn để triển khai giao thức GTMFetcherAuthorizationProtocol và gán nó làm người ủy quyền của bạn.

MyAuth *myAuth = [[MyAuth alloc] initWithAccessToken:accessToken]; 
googleService.authorizer = myAuth; 

Lớp này cần ủy quyền yêu cầu dựa trên mã thông báo truy cập bạn đã có. Mã của lớp này phải tương tự như vậy.

@interface MyAuth : NSObject<GTMFetcherAuthorizationProtocol>  
    @property (copy, nonatomic) NSString *accessToken; 
    @property (copy, readonly) NSString *userEmail; 
@end 

@implementation MyAuth 

- (void)authorizeRequest:(NSMutableURLRequest *)request 
       delegate:(id)delegate 
     didFinishSelector:(SEL)sel { 
    if (request) { 
     NSString *value = [NSString stringWithFormat:@"%s %@", GTM_OAUTH2_BEARER, self.accessToken]; 
     [request setValue:value forHTTPHeaderField:@"Authorization"]; 
    } 

    NSMethodSignature *sig = [delegate methodSignatureForSelector:sel]; 
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
    [invocation setSelector:sel]; 
    [invocation setTarget:delegate]; 
    [invocation setArgument:(__bridge void *)(self) atIndex:2]; 
    [invocation setArgument:&request atIndex:3]; 
    [invocation invoke]; 
} 

- (void)authorizeRequest:(NSMutableURLRequest *)request 
     completionHandler:(void (^)(NSError *error))handler { 
    if (request) { 
     NSString *value = [NSString stringWithFormat:@"%@ %@", @"Bearer", self.accessToken]; 
     [request setValue:value forHTTPHeaderField:@"Authorization"]; 
    } 
} 

- (BOOL)isAuthorizedRequest:(NSURLRequest *)request { 
    return NO; 
} 

- (void)stopAuthorization { 
} 

- (void)stopAuthorizationForRequest:(NSURLRequest *)request { 
} 

- (BOOL)isAuthorizingRequest:(NSURLRequest *)request { 
    return YES; 
} 

Hy vọng điều đó sẽ hữu ích.

+0

làm thế nào bạn sẽ thực hiện điều này trong Swift 2.0? Làm thế nào bạn sẽ xử lý NSInvocation cho Swift không còn phơi bày nó? – sun

+0

hi @balkoth, tôi có yêu cầu tương tự. Tôi đã tạo trình ủy quyền của riêng mình triển khai GTMFetcherAuthorizationProtocol như đã đề cập. Tôi nhận được accesstoken từ máy chủ mà tôi đặt trong khi initing inst. Tôi có ID thư gmail và tôi muốn tìm thư hoàn chỉnh từ đó, Tôi nên tiếp tục tại đây như thế nào, Ngoài ra ở đâu để đặt clientID. –

Các vấn đề liên quan