3

ユーザーが自分の LinkedIn パブリック プロフィールに自動的に投稿できるように、LinkedIn OAuth を作成した Phonegap アプリケーションに追加しようとしています。Childbrowser プラグインを介して LinkedIn REST API からアクセス トークンを取得するのに問題があるようです。REST API 呼び出しに署名するために、JavaScript で OauthSimple プラグインを使用しています。

署名済みの POST を REST API に送信すると、401 Unauthorized エラーが発生します。無効な署名を持っていることを指定しており、何が間違っているのか一生わかりません。

これは、アクセス トークンを要求したときに LinkedIn から受け取る json 応答です。

{"readyState":4,
"responseText":"oauth_problem=signature_invalid&
oauth_problem_advice=com.linkedin.security.auth.pub.LoginDeniedInvalidAuthTokenException%20
while%20obtaining%20request%20token%20for%20%3APOST%26
https%253A%252F%252Fapi.linkedin.com%252Fuas%252Foauth%252F
accessToken%26
oauth_consumer_key%253Dkivazo8r4xr3%2526
oauth_nonce%253D6ruTZ%2526
oauth_signature_method%253DHMAC-SHA1%2526
oauth_timestamp%253D1360525594%2526
oauth_token%253D0011aab8-0cf0-4555-ba44-304b34e4b636%2526
oauth_verifier%253D32140%2526
oauth_version%253D1.0,
"status":401,
"statusText":"Unauthorized"}

私のJavaScriptを見たい場合は、ここに私の関数があります:

function parametersFromUrl(url) {
    var result = {};
    //Remove everything up to where the parameters start. could be after # or after ?
    url = url.substr(url.indexOf('?') + 1).substr(url.indexOf('#') + 1)
    //Replace html escape characters
    url = url.replace(/%23/g, '#').replace(/%26/g, '&').replace(/%3D/g, '=');
    var parameters = url.split('&');
    for(var i = 0; i < parameters.length; i++) {
        var parameter = parameters[i].split('=');
        result[parameter[0]] = parameter[1];
    }
    return result;
}

/* -- Linkedin START -- */

var Linkedin = {
    init:function() {
        var signatures = { consumer_key: '555555', shared_secret: '555555' };
        var simple = new OAuthSimple(signatures.consumer_key, signatures.shared_secret);
        Linkedin.getRequestToken(simple, signatures);
    },
    getRequestToken:function(simple, signatures) {
        var result = simple.reset().sign({
            action: 'POST',
            path: 'https://api.linkedin.com/uas/oauth/requestToken',
            signatures: signatures
        });
        console.log(result);
        console.log(result.signed_url);
        jQuery.ajax({
            url: result.signed_url,
            type: 'POST',
            success: function(data) {
                jQuery.extend(signatures, parametersFromUrl(data));
                console.log(signatures['oauth_token']);
                Linkedin.childBrowserAuthenticate(simple, signatures);
            },
            error: function() {
                console.log('error');
            }
        });
    },
    childBrowserAuthenticate:function(simple, signatures) {
        ChildBrowser.install();
        var childBrowser = window.plugins.childBrowser;
        var browserUrl = simple.reset().sign({
            path: signatures['xoauth_request_auth_url']
        }).signed_url;
        browserUrl = browserUrl + '&oauth_token=' + signatures['oauth_token'];
        childBrowser.showWebPage(decodeURIComponent(browserUrl));

        function finish(err) {
            if (err) onFailure(err);
            childBrowser.onClose = null;
            childBrowser.close();
        }

        childBrowser.onLocationChange = function(loc) {
            if (loc.indexOf('oauth_problem') > -1) {
                finish('User authorization error');
            } else if (loc.indexOf('oauth_verifier') > -1) {
                alert('good');
                finish();
                $.each(signatures, function(i,item) {
                    console.log(i);
                    console.log(item);
                });
                console.log("next");
                params = parametersFromUrl(loc);
                jQuery.extend(signatures, params);
                $.each(signatures, function(i,item) {
                    console.log(i);
                    console.log(item);
                });
                Linkedin.getAccessToken(simple, signatures);
            }
        };

        childBrowser.onClose = function() {
            finish('User cancelled authorization.');
        };
    },
    getAccessToken:function(simple, signatures) {
        console.log("last");
        $.each(signatures, function(i,item) {
                    console.log(i);
                    console.log(item);
                });

        var requestUrl = simple.reset().sign({
            action: 'POST',
            path: 'https://api.linkedin.com/uas/oauth/accessToken',
            parameters: {
                'oauth_verifier': signatures.oauth_verifier,
                'oauth_token': signatures.oauth_token,
                'oauth_token_secret': signatures.oauth_token_secret,
                'oauth_version': "1.0"
            }
        }).signed_url;
        console.log(requestUrl);
        jQuery.ajax({
            url: requestUrl,
            type: 'POST',
            success: function(data) {
                jQuery.extend(signatures, parametersFromUrl(data));
                $.each(signatures, function(i,item) {
                    console.log(i);
                    console.log(item);
                });
                Linkedin.getUserProfile();
            },
            error: function(resp) {
                alert('crap');
                console.log(resp);
            }
        });
    },
    getUserProfile:function() {
        var result = simple.reset().sign({
            action: 'GET',
            path: 'https://api.linkedin.com/v1/people/~:(first-name,last-name,headline,picture-url)',
            parameters: {
                format: 'json'
            }
        });

        jQuery.ajax({
            url: result.signed_url,
            success: function(userData) {
                onSuccess(userData);
                alert('success');
                alert(userData);
            },
            error: function(resp) {
                onFailure('Failed to get profile information')
            }
        });
    }
};

/* -- Linkedin END -- */

アクセス トークンを取得するために LinkedIn REST API に要求 (POST) を行うと、URL は次のようになります。

https://api.linkedin.com/uas/oauth/accessToken?oauth_consumer_key=555555&oauth_nonce=KXuSN&oauth_signature=rk7eNjTxlhi0UOppOPfA%2BYvQ8uM%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1360527087&oauth_token=206e2377-c790-49a6-839c-a996cadfbdfc&oauth_verifier=62355&oauth_version=1.0

私の oauth 署名を Linkedin oauth コンソールによって生成されたものと比較しましたが、それらは同じではありません。何が間違っている可能性がありますか?

このチュートリアルを使用して、プロセスをガイドしました。

さらに情報が必要な場合は、お知らせください。質問に追加します。

どうもありがとう!

4

2 に答える 2

1

Linkedin Javascript ライブラリを使用しないのはなぜですか? 署名リクエストなど、すべてのバックエンド作業を行います。これをヘッダー ファイルに配置します。

<script type="text/javascript" src="http://platform.linkedin.com/in.js">
   api_key:    [API_KEY]
</script>

次に、サインイン ボタンを表示する必要がある場所にこれを配置します。

 <script type="in/Login"> Hello, <?js= firstName ?> <?js= lastName ?>. </script> 
于 2013-02-13T11:48:35.297 に答える
0

だから私は私の答えを見つけました!私は Phonegap を使用しているので、署名ライブラリなしで API への直接の JSON 呼び出しを行うことができます。そのため、OAuth 2.0 を使用して API から認証コードを直接要求し、値を URL に追加しました。ここにドキュメントへのリンクがあります。

https://developer.linkedin.com/documents/authentication

于 2013-03-26T11:06:54.197 に答える