ios - 如何在iOS中获取Linkedin访问 token 来调用API?

标签 ios api rest oauth linkedin-api

我有一个 REST API,允许客户端通过 Linkedin 传递访问 token 来登录。

我通过从 Javascript API 获取访问 token 来创建此服务并发送登录,然后 api 调用 LinkedIn API 来检索用户数据。这工作正常,但我们在使用 iOS 生成的访问 token 时遇到了问题。

我们正在使用LinkedIn OAuth Sample Client在移动设备上登录 LinkedIn,然后我们会获得访问 token 。使用该访问 token ,我们的 API 无法调用 LinkedIn。

我的问题是:这是在 API 中使用 LinkedIn API 的正确方法吗?而且,如果是,我如何在 iOS 集成中生成正确的访问 token 到我的 API 可以使用它?

最佳答案

您需要遵循简单的步骤。
1.您需要向LinkedIn请求用户授权。 (将在此处收到授权代码作为响应。)
2. 使用授权码,您需要使用上面收到的授权码向linkedIn发出POST请求。

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 并使用名称为 webViewIBOutlet 连接到它,您可以在上面找到它代码。

不要忘记确认 UIWebViewDelegate。

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

关于ios - 如何在iOS中获取Linkedin访问 token 来调用API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19189446/

相关文章:

objective-c - cocos2d 中的 UIActivityIndi​​catorView

ios - 不鼓励在分离的 View Controller 上呈现 View Controller - 屏幕 View 变黑

ios - 为什么在iOS项目生成的XCTestCase中引入了Cocoa.h?

azure - 如何使用 Python 在 Azure Devops 中创建 Wiki 子页面?

ruby-on-rails - 服务到服务认证、服务身份和访问权限管理

python - Django + Auth0 JWT 认证拒绝解码

ios - 检查 UICollectionViewCell 是否已创建以避免重用

c# - 如何在 Visual C# Forms 应用程序中使用 Google Maps API?

php - 如何在 api 平台中通过过滤实现自定义项获取端点?

python - Flask-HTTPAuth 用户访问级别