iOS 6でAFOAuth2ClientとAFNetworkingを使用すると、アクセストークンを取得できますが、リソースにアクセスできません。サーバーは、401許可されていないステータスコードで応答します。これは、OAuthプロバイダーとしてドアキーパーを使用するカスタムRails3APIバックエンドに反します。OAuth2 gemを使用する次のクライアントルビーコードは、正常に機能します。
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
iOSコードは次のとおりです。ログインボタンハンドラーで、ユーザー名とパスワードを使用して認証し、資格情報を保存します。
- (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:@""];
}];
}
AFHTTPClient
エンドポイントをサブクラス化してinitWithBaseURL
、クレデンシャルを取得し、アクセストークンを使用して認証ヘッダーを設定します。
- (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;
}
これはAFOAuth2ClientとAFNetworkingを使用する正しい方法ですか?そして、なぜこれが機能しないのか考えてみてください。