2

クライアントがLinkedinからアクセストークンを渡してLinkedinにログインできるようにするREST APIがあります。

このサービスは、API が LinkedIn API を呼び出してユーザー データを取得するよりも、Javascript APIからアクセス トークンを取得し、ログインするために送信することによって作成しました。これは正常に機能しますが、iOS で生成されたアクセス トークンに問題があります。

LinkedIn OAuth Sample Clientを使用してモバイルで LinkedIn にログインし、アクセス トークンを取得します。そのアクセス トークンでは、API は LinkedIn を呼び出すことができません。

私の質問は、API 内で LinkedIn API を使用する正しい方法ですか? もしそうなら、どうすれば私のAPIへのiOS統合で正しいアクセストークンを生成してそれを使用できますか?

4

1 に答える 1

2

簡単な手順に従う必要があります。
1. LinkedIn にユーザーの承認をリクエストする必要があります。(応答としてここで anauthorisation 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 からライブラリを取得して、プロジェクトに追加してください。AFHTTPSessionManager.hこの目的のために、viewControllerにインポートする必要があります。

#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で接続しました。これは上記のコードで確認できます。 IBOutletwebView

UIWebViewDelegate を確認することを忘れないでください。

これが役立つことを願っています。
幸運を。

于 2016-04-30T11:43:52.477 に答える