2015-10-20 16 views
4

У меня возникли трудности с обменом токенами JSAPI на токен REST API. Я использую это для справки:Linkedin API: Exchange JSAPI Token для REST API OAuth Token

https://developer-programs.linkedin.com/documents/exchange-jsapi-tokens-rest-api-oauth-tokens

Я: создать самозаверенный SSL сертификат на местном уровне, так безопасно печенье в LinkedIn работает должным образом; учитывая мои права доступа r_basicprofile и r_emailaddress.

Вот мой передний конец код:

<script type="text/javascript" src="//platform.linkedin.com/in.js"> 
    api_key: **MY_CLIENT_ID** 
    authorize: true 
    credentials_cookie: true 
</script> 

... 

$('.linkedin-signin').click(function(e) {  
    IN.User.authorize(function() { 
     IN.API.Raw("/people/~").result(function(data) { 
      $.post(location.origin+'/api/account/create/linkedin', { 'lId': data.id }).done(function(result) {     
       console.log(result);  
      }); 
     }); 
    }); 
    return false; 
}); 

А вот мой PHP код, который почти так же, как в их документации:

$consumer_key = '**MY_CLIENT_ID**'; 
$consumer_secret = '**MY_CLIENT_SECRET**'; 
$cookie_name = "linkedin_oauth_${consumer_key}"; 
$credentials_json = $_COOKIE[$cookie_name]; 
$credentials = json_decode($credentials_json); 

$access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken';    

$oauth = new OAuth($consumer_key, $consumer_secret); 
$access_token = $credentials->access_token; 

// swap 2.0 token for 1.0a token and secret 
$oauth->fetch($access_token_url, array('xoauth_oauth2_access_token' => $access_token), OAUTH_HTTP_METHOD_POST); 

Все выглядит хорошо, но на $oauth->fetch, я получаю погрешность:

OAuthException(code: 401): Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect) 

Это заставляет меня поверить, что токен недействителен ... но он берется непосредственно из файла cookie, так как это может быть недействительным? Есть идеи?

+0

вы не везло найти решение для этой проблемы? – bks

+0

К сожалению, нет. Меня немного раздражает то, что Linkedin направляет людей сюда для технической поддержки, но не отвечает на большинство вопросов. Я сдался и оставил Linkedin вне вариантов социального входа для моего сайта. – DiscoInfiltrator

+1

Я столкнулся с той же проблемой, и этот https://developer-programs.linkedin.com/documents/exchange-jsapi-tokens-rest-api-oauth-tokens сломан, я думаю, возможно, LinkedIn просто удалил этот API – Neekey

ответ

1

Сегодня у нас также возникла странная ошибка 401, связанная с повреждением, потому что через час она снова работала без каких-либо изменений на нашей стороне.

Я нашел этот сайт, хотя и, несмотря на то, что это действительно старое сообщение, я бы сказал, как бы мы его исправили, и это работает.

JS Фронтальный

var AppConfig = { 
    linkedin : { 
     onLoad : "linkedinLibInit", 
     api_key : 'YOUR_API_KEY', 
     authorize : false, 
     credentials_cookie: true 
    } 
}; 

window.linkedinLibInit = function (response) { 
    // post init magic 

    // cleanup window callback function 
    delete window.linkedinLibInit; 
} 

$.getScript("//platform.linkedin.com/in.js?async=true", function success() { 
    IN.init(AppConfig.linkedin); 
}); 


function connectToLinkedIn() { 
    if (IN.User.isAuthorized()) { 
     _linkedinAuthorized(); 
    } 
    else { 
     IN.User.authorize(_linkedinAuthorized); 
    } 
} 

function _linkedinAuthorized() { 
    IN.API.Profile("me") 
     .fields('id', 'first-name', 'last-name', 'location', 'industry', 'headline', 'picture-urls::(original)', 'email-address') 
     .result(function (response) { 
      var accessToken = JSON.parse($.cookie('linkedin_oauth_' + AppConfig.linkedin.api_key)); 
      // performApi Call to backend 
     }) 
     .error(function (err) { 
      // render error 
     }); 
} 

PHP Backend с использованием PECL OAuth

function offlineAuthLinkedIn($accessToken, $linkedinConfig) { 
    $oAuth = new \OAuth($linkedinConfig['app_id'], $linkedinConfig['app_secret']); 
    $oAuth->fetch(
     'https://api.linkedin.com/uas/oauth/accessToken', 
     array('xoauth_oauth2_access_token' => $accessToken), 
     OAUTH_HTTP_METHOD_POST 
    ); 
    $response = null; 
    parse_str($oAuth->getLastResponse(), $response); 

    $oAuth->setToken($response['oauth_token'], $response['oauth_token_secret']); 
    $oAuth->fetch(
     'http://api.linkedin.com/v1/people/~:(id,first-name,last-name,formatted-name,headline,location,picture-url,picture-urls::(original),public-profile-url)', 
     array(), 
     OAUTH_HTTP_METHOD_GET, 
     array('x-li-format' => 'json') 
    ); 
    $profile = json_decode($oAuth->getLastResponse(), true); 
    $profile['user_id'] = $profile['id']; 
    if (true == isset($profile['pictureUrl'])) 
    { 
     $profile['profile_image'] = $profile['pictureUrl']; 
     unset($profile['pictureUrl']); 
    } 
    return $profile; 
}