Sử dụng AFOAuth2Client và AFNetworking trên iOS 6 Tôi có thể nhận mã thông báo truy cập nhưng không thể truy cập tài nguyên, máy chủ phản hồi với mã trạng thái 401 trái phép. Điều này là chống lại một chương trình phụ trợ API Rails 3 tùy chỉnh bằng cách sử dụng trình quản lý cửa sổ làm nhà cung cấp OAuth. sau khi mã khách hàng ruby, sử dụng đá quý OAuth2, hoạt động OK:AFOAuth2Không thể truy cập tài nguyên
client = OAuth2::Client.new(app_id, secret, site: "http://subdomain.example.com/")
access_token = client.password.get_token('username', 'password')
access_token.get('/api/1/products').parsed
mã iOS là như dưới đây, trong xử lý nút đăng nhập tôi xác thực bằng cách sử dụng tên đăng nhập và mật khẩu, và lưu trữ các thông tin quan trọng:
- (IBAction)login:(id)sender {
NSString *username = [usernameField text];
NSString *password = [passwordField text];
NSURL *url = [NSURL URLWithString:kClientBaseURL];
AFOAuth2Client *client = [AFOAuth2Client clientWithBaseURL:url clientID:kClientID secret:kClientSecret];
[client authenticateUsingOAuthWithPath:@"oauth/token"
username:username
password:password
scope:nil
success:^(AFOAuthCredential *credential) {
NSLog(@"Successfully received OAuth credentials %@", credential.accessToken);
[AFOAuthCredential storeCredential:credential
withIdentifier:client.serviceProviderIdentifier];
[self performSegueWithIdentifier:@"LoginSegue" sender:sender];
}
failure:^(NSError *error) {
NSLog(@"Error: %@", error);
[passwordField setText:@""];
}];
}
và tôi đã subclassed AFHTTPClient
cho thiết bị đầu cuối của tôi và trong initWithBaseURL
nó lấy các chứng chỉ và đặt tiêu đề cho phép với access token:
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"application/json"];
AFOAuthCredential *credential = [AFOAuthCredential retrieveCredentialWithIdentifier:@"subdomain.example.com"];
[self setAuthorizationHeaderWithToken:credential.accessToken];
return self;
}
Đây có phải là cách chính xác để sử dụng AFOAuth2Client và AFNetworking không? Và bất kỳ ý tưởng tại sao điều này không hoạt động?
Hãy nhìn vào các tập tin https://github.com/AFNetworking/AFOAuth2Client/blob/master/AFOAuth2Client/AFOAuth2Client.h. Có một lưu ý ở trên cùng rằng bạn không nên sử dụng nó làm lớp cơ sở của bạn. – davidbitton