如何从 iOS 调用 OAuth 2.0 API
How to call an OAuth 2.0 API from iOS
我正在研究 Fitbit integration. How can I make request and authorize its OAuth 2.0 API. I checked ASIHTTPRequest but it is not available on ARC. Can I do it with AFNetworking?我正在使用 Objective-C.
使用 AFNetworking
使用 AFOAuth2Manager 完成,这里是代码
在ViewController.m
#define CLIENT_ID @"your client id"
#define CONSUMER_SECRET @"your consumer secret"
使用 Safari 开始授权。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize?response_type=code&client_id=227FKJ&redirect_uri=http%3A%2F%2Fcallback.com%2Ffitbit&scope=activity%20nutrition%20heartrate%20location%20nutrition%20profile%20settings%20sleep%20social%20weight"]];
从 NSUserDefaults
获取响应代码
NSString *string = [[NSUserDefaults standardUserDefaults] valueForKey:@"auth_code"];
NSURL *baseURL = [NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize"];
AFOAuth2Manager *OAuth2Manager =
[[AFOAuth2Manager alloc] initWithBaseURL:baseURL
clientID:CLIENT_ID secret:CONSUMER_SECRET];
NSDictionary *dict = @{@"client_id":CLIENT_ID, @"grant_type":@"authorization_code",@"redirect_uri":@"http://lampdemos.com/fitbit",@"code":string};
[OAuth2Manager authenticateUsingOAuthWithURLString:@"https://api.fitbit.com/oauth2/token" parameters:dict success:^(AFOAuthCredential *credential) {
NSLog(@"Token: %@", credential.accessToken);
AppDelegate *adddel = (AppDelegate *)[[UIApplication sharedApplication]delegate];
adddel.credential = credential;
[self getUserProfileWithCredentials:credential];
} failure:^(NSError *error) {
NSLog(@"Error: %@", error);
}];
调用进一步的请求
-(void)getUserProfileWithCredentials:(AFOAuthCredential*)credential{
NSURL *baseURL = [NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize"];
AFHTTPRequestOperationManager *manager =
[[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
[manager.requestSerializer setAuthorizationHeaderFieldWithCredential:credential];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"https://api.fitbit.com/1/user/-/profile.json"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
NSDictionary *userDict =[dictResponse valueForKey:@"user"];
NSLog(@"Success: %@", userDict);
NSMutableString *str =[NSMutableString stringWithFormat:@"%@",@""];
for (NSString *key in [userDict allKeys]) {
[str appendFormat:@"%@ %@\n",key,[NSString stringWithFormat:@"%@",[userDict valueForKey:key]]];
}
self.profileDetails.text =str;
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", error);
}];
}
我正在研究 Fitbit integration. How can I make request and authorize its OAuth 2.0 API. I checked ASIHTTPRequest but it is not available on ARC. Can I do it with AFNetworking?我正在使用 Objective-C.
使用 AFNetworking
使用 AFOAuth2Manager 完成,这里是代码
在ViewController.m
#define CLIENT_ID @"your client id"
#define CONSUMER_SECRET @"your consumer secret"
使用 Safari 开始授权。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize?response_type=code&client_id=227FKJ&redirect_uri=http%3A%2F%2Fcallback.com%2Ffitbit&scope=activity%20nutrition%20heartrate%20location%20nutrition%20profile%20settings%20sleep%20social%20weight"]];
从 NSUserDefaults
NSString *string = [[NSUserDefaults standardUserDefaults] valueForKey:@"auth_code"];
NSURL *baseURL = [NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize"];
AFOAuth2Manager *OAuth2Manager =
[[AFOAuth2Manager alloc] initWithBaseURL:baseURL
clientID:CLIENT_ID secret:CONSUMER_SECRET];
NSDictionary *dict = @{@"client_id":CLIENT_ID, @"grant_type":@"authorization_code",@"redirect_uri":@"http://lampdemos.com/fitbit",@"code":string};
[OAuth2Manager authenticateUsingOAuthWithURLString:@"https://api.fitbit.com/oauth2/token" parameters:dict success:^(AFOAuthCredential *credential) {
NSLog(@"Token: %@", credential.accessToken);
AppDelegate *adddel = (AppDelegate *)[[UIApplication sharedApplication]delegate];
adddel.credential = credential;
[self getUserProfileWithCredentials:credential];
} failure:^(NSError *error) {
NSLog(@"Error: %@", error);
}];
调用进一步的请求
-(void)getUserProfileWithCredentials:(AFOAuthCredential*)credential{
NSURL *baseURL = [NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize"];
AFHTTPRequestOperationManager *manager =
[[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
[manager.requestSerializer setAuthorizationHeaderFieldWithCredential:credential];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"https://api.fitbit.com/1/user/-/profile.json"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
NSDictionary *userDict =[dictResponse valueForKey:@"user"];
NSLog(@"Success: %@", userDict);
NSMutableString *str =[NSMutableString stringWithFormat:@"%@",@""];
for (NSString *key in [userDict allKeys]) {
[str appendFormat:@"%@ %@\n",key,[NSString stringWithFormat:@"%@",[userDict valueForKey:key]]];
}
self.profileDetails.text =str;
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", error);
}];
}