2013-10-04 71 views
2

我有一个REST API,允许客户端使用Linkedin从Linkedin传递访问令牌。如何在iOS中获取Linkedin访问令牌以调用API?

我通过从Javascript API获取访问令牌并发送登录,而不是通过API调用LinkedIn API来检索用户数据,从而创建了此服务。这工作正常,但我们遇到了iOS生成的访问令牌的问题。

我们使用LinkedIn OAuth Sample Client在移动设备上登录LinkedIn,并获取访问令牌。使用该访问令牌,我们的API不能调用LinkedIn。

我的问题是:这是在API内使用LinkedIn API的正确方法吗?而且,如果是这样,我怎么才能在iOS中集成正确的访问令牌给我的API使用呢?

回答

2

你需要遵循简单的步骤。
1.您需要向LinkedIn申请授权用户。 (将会收到一个authorisation code作为回应。)
2.使用授权码,您需要向linkedIn发送POST请求,上面收到authorisation code

ViewDidLoad

-(void)viewDidLoad 
{ 
#warning:- Please provide your clientID and clientSecret 
linkedInKey = @"YOUR_CLIENT_ID_HERE"; 
linkedInSecret = @"YOUR_CLIENT_SECRET_HERE"; 
authorizationEndPoint = @"https://www.linkedin.com/uas/oauth2/authorization"; 
accessTokenEndPoint = @"https://www.linkedin.com/uas/oauth2/accessToken"; 
#warning:- Please provide your redirectUrl here. 
NSString *redirectURL = @"http://REDIRECT_URL_THAT_YOU_HAVE_PROVIDED_WHILE_REGISTERING_YOUR_APP"; 
encodedRdirectURL = [redirectURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.alphanumericCharacterSet]; 
_webView.delegate = self; 
[self startAuthorisation]; 
} 

-(void)startAuthorisation 
{ 
// Specify the response type which should always be "code". 
NSString *responseType = @"code"; 
// Create a random string 
NSString *state = @"anyRandomString"; 
// Set preferred scope. It depends on your preference. 
NSString *scope = @"w_share"; 
// Create the authorization URL string. 
NSString *authorizationURL = [NSString stringWithFormat:@"%@?response_type=%@&client_id=%@&redirect_uri=%@&state=%@&scope=%@",authorizationEndPoint,responseType,linkedInKey,encodedRdirectURL,state,scope]; 

NSLog(@"%@",authorizationURL); 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:authorizationURL]]; 
[_webView loadRequest:request]; 
} 

#pragma mark- WebView Delegate. 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
NSURL *url = request.URL; 
//here we will catch the response of the server which will redirect to our redirect url. Hence we first check for the host(which is our redirect url) then only extract the code. 
#warning:- Please provide your redirectUrl here. 
if ([url.host isEqualToString:@"www.Your_redirect_url.com"]) 
{ 
    if ([url.absoluteString rangeOfString:@"code"].length) 
    { 

//response containing the authorisation code looks somehow like below. 
    //http://www.Your_redirect_url.com?<strong>code=AQSetQ252oOM237XeXvUreC1tgnjR-VC1djehRxEUbyZ-sS11vYe0r0JyRbe9PGois7Xf42g91cnUOE5mAEKU1jpjogEUNynRswyjg2I3JG_pffOClk</strong>&state=linkedin1450703646 

    //......obtaining the code from the response......// 
     NSArray *urlParts = [url.absoluteString componentsSeparatedByString:@"?"]; 
     NSString *codePart = [urlParts objectAtIndex:1]; 
     NSArray *codeParts = [codePart componentsSeparatedByString:@"="]; 
     NSString *code = [codeParts objectAtIndex:1]; 
     [self requestforAccessToken:code]; 
    } 
} 
return YES; 
} 

- (void)requestforAccessToken:(NSString *)authorisationCode 
{ 
NSString *grantType = @"authorization_code"; 
NSString *postParameter = [NSString stringWithFormat:@"grant_type=%@&code=%@&redirect_uri=%@&client_id=%@&client_secret=%@",grantType,authorisationCode,encodedRdirectURL,linkedInKey,linkedInSecret]; 
NSData *postdata = [postParameter dataUsingEncoding:NSUTF8StringEncoding]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:accessTokenEndPoint]]; 
request.HTTPMethod = @"POST"; 
request.HTTPBody = postdata; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 


manager.responseSerializer = [AFJSONResponseSerializer 
           serializerWithReadingOptions:NSJSONReadingAllowFragments]; 


[[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * response, id responseObject, NSError * error) 
    { 
     if (!error) 
     { 
      NSLog(@"Reply JSON: %@", responseObject); 
      NSString *accessToken = [responseObject objectForKey:@"access_token"]; 
      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
      [defaults setObject:accessToken forKey:@"linkedInAccessToken"]; 
      [defaults synchronize]; 
     } 

    }] resume]; 

} 

我在这里使用AFNetworking库。所以请从gitHub获取库并将其添加到您的项目中。您需要在您的viewController中导入AFHTTPSessionManager.h用于此目的。

#warning:- please declare these following strings as global variable under interface as. 
@interface WebViewController()<UIWebViewDelegate> 
{ 
NSString *linkedInKey; 
NSString *linkedInSecret; 
NSString *authorizationEndPoint; 
NSString *accessTokenEndPoint; 
NSString *encodedRdirectURL;  
} 

而且我也已经采取了UIWebView并连接到它与IBOutlet的名称webView,你可以在上面的代码中找到它。

不要忘记确认UIWebViewDelegate。

希望这会有所帮助。
祝你好运。

相关问题