JavaScriptクライアントから受信したトークンを使用して、サーバー上にソーシャル接続を作成します

ジュリアン・チェンナレス

クライアント側でGoogleサインインプロセスを正常に実行できるPHP / JavaScriptを使用したWebページがあります。次に、取得したトークンをバックエンドに転送します。バックエンドは、Spring-Socialを使用してソーシャル接続を作成し、アプリが承認されているAPIを呼び出すことができるようにします。Facebook(OAUTH2)とTwitter(OAUTH1)の両方が問題なく機能しているので、これを正確に行うことができましたが、Googleの場合、接続を作成しようとすると常に401応答が返されます。サーバーのコードは次のようになります。

AccessGrant accessGrant = new AccessGrant(accessToken);
connection = ((OAuth2ConnectionFactory<?>) connectionFactory).createConnection(accessGrant);

クライアントのコードは次のようになります。

    function onSignIn(googleUser) {
        var profile = googleUser.getBasicProfile();
        console.log('ID: ' + profile.getId());
        console.log('Name: ' + profile.getName());
        console.log('Email: ' + profile.getEmail());

        var access_token = googleUser.getAuthResponse().id_token;
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://localhost/signin/google');
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.onload = function() {
            console.log('Signed in as: ' + xhr.responseText);
            console.log('access_token=' + access_token);
        };
        xhr.send('access_token=' + access_token);

    }

後者のほとんどは、https//developers.google.com/identity/sign-in/web/backend-authにあるバックエンドサーバーで認証する方法に関するGoogleのドキュメントからコピーされています

spring-social-google内の呼び出しをトレースしたところ、https://www.googleapis.com/oauth2/v2/userinfoへのREST呼び出しが発生しましたこれは、401と次のJSONに応答する呼び出しです。

{
    "error": {
        "errors": [{
            "domain": "global",
            "reason": "authError",
            "message": "Invalid Credentials",
            "locationType": "header",
            "location": "Authorization"
        }],
        "code": 401,
        "message": "Invalid Credentials"
    }
}

私はこの同じRESTAPIを自分で呼び出そうとしましたが、同じ応答が返されます。そのため、他のいくつかの投稿で読んだように、spring-social-googleがトークンを正しく送信しないという問題ではないようです。

この問題は、JavaScript APIが「id_token」を提供し、RESTAPIが「access_token」を期待しているという事実に何らかの形で関連していると思います。ただし、id_tokenとは別のものとしてアクセストークンを取得する方法が見つかりません。Googleのドキュメントはid_tokenをバックエンドに送信します。googleUser.getAuthResponse()で使用されている「id_token」プロパティの横に「access_token」プロパティがありますが、未定義で戻ってきます。このドキュメントはもちろん春の社会を対象としていないので、それが間違っていると言っているわけではありません。これを達成するための適切な方法は何か疑問に思っています。

id_tokenを処理できないことにより、spring-socialに問題がありますか?

access_tokenを取得するための明確な方法が見当たらないのは間違いですか?

とにかく、私はどういうわけか近いように感じますが、それでも解決策は十分に理解されていないようです。

ありがとうございました!

ジュリアン・チェンナレス

さて、私はそれを見つけました。全部書き留めておくと、脳内で何かがつまずいたようです...

問題は、実際には、id_tokenがaccess_tokenの代わりになることができないということです。私の好みでは、Googleのドキュメントは、表示されている例でこれについてもう少し明確になっている可能性がありますが、https://developers.google.com/identity/sign-in/web/の実際のクライアントリファレンスで説明されています。参照

キーはgetAuthResponse()のブールパラメータであり、これはオプションであり、デフォルトはfalseです。ドキュメントから:

includeAuthorizationDataオプション:アクセストークンとスコープを常に返すかどうかを指定するブール値。デフォルトでは、fetch_basic_profileがtrue(デフォルト値)の場合、アクセストークンと要求されたスコープは返されず、追加のスコープは要求されません。

私のJSでこれをtrueに設定すると、以前は定義されていなかったaccess_tokenフィールドにデータが入力され、このトークンを使用して/ oauth2 / v2 / userinfoエンドポイントにアクセスでき、spring-social-googleは他のプロバイダーと同じように正しく接続を作成できます。

これが少なくとも他の誰かに役立つことを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

クライアントは、受信したのと同じJWTトークンを使用してサーバーにコールバックしますか?

分類Dev

ソケット接続を介してクライアントからサーバーに画像を送信する

分類Dev

Pythonサーバーは、接続された最初のクライアントからだけでなく、接続されたすべてのクライアントから受信を取得します

分類Dev

クライアントモバイルアプリから受信したアクセストークンを使用してFBGraphAPIにアクセスする

分類Dev

NodeJSサーバーのクライアントから受信したデータを印刷します

分類Dev

クライアント/サーバーチャット、オンラインユーザーリストの送信、最後に接続したクライアントによってのみ受信されましたか?

分類Dev

サーバーからTLSアラートを受信しました:ハンドシェイクに失敗しました(40)

分類Dev

クライアントからSYNを受信した直後にサーバーがSYN / ACKを送信する

分類Dev

javascriptクライアントをpythonwebsocketサーバーに接続します

分類Dev

nettyでアプリケーションを作成し、クライアントからサーバーにメッセージを送信しましたが、サーバーがメッセージを受信できません

分類Dev

クライアントをサーバーに接続し、C#でクライアントからテキストファイルを取得します

分類Dev

クライアント側から受信したGoogle認証コードを使用して、サーバー側のJavaScript(nodejs)でアクセストークンを取得します

分類Dev

サーバーのソケットとCのクライアントアプリケーションを介してJSONを送受信します

分類Dev

mbedtlsサンプルクライアントを使用してhttpsサーバーに接続できません

分類Dev

クライアントごとに複数のUDP接続を使用してJavaサーバーを作成する

分類Dev

インターネットにアクセスできるローカル サーバーを介して、クラウド上のプライベート仮想マシンからインターネットに接続する必要がある

分類Dev

Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

分類Dev

SignalRはサーバーからクライアントに接続します

分類Dev

APIから受信したデータを更新するためにどのコンポーネントライフサイクルを使用しますか

分類Dev

c#クライアントはprotobufを使用してJava nettyサーバーに接続します

分類Dev

レンダラーからのメッセージの受信がタイムアウトしました:WindowsのJenkinsを介してchromedriverとchromeを使用してスクリーンショットをキャプチャしているときに10.000

分類Dev

1つのクライアントが受信したメッセージを、サーバーに接続されている他のすべてのクライアントに送信できません

分類Dev

クライアントが受信したときにサーバーからバイト配列を返すのは異なります

分類Dev

C#クライアント上のC ++サーバーから送信されたデータを受信します

分類Dev

Javaクライアントを使用してMQチャネルに接続しています:CERTLABLエラー

分類Dev

WithBlock()オプションを使用してgRPCクライアント接続を作成し、非同期で開始されたgRPCサーバーを無期限にブロックしますか?

分類Dev

プロキシサーバーを使用してクライアントに接続する

分類Dev

C ++ APIを使用して暗号化されたチャネルでmqクライアントをmqサーバーに接続する

分類Dev

C#クライアントからサーバーへのデータ転送サーバーは以前のクライアントメッセージを受信しています非同期サーバー-非同期クライアント

Related 関連記事

  1. 1

    クライアントは、受信したのと同じJWTトークンを使用してサーバーにコールバックしますか?

  2. 2

    ソケット接続を介してクライアントからサーバーに画像を送信する

  3. 3

    Pythonサーバーは、接続された最初のクライアントからだけでなく、接続されたすべてのクライアントから受信を取得します

  4. 4

    クライアントモバイルアプリから受信したアクセストークンを使用してFBGraphAPIにアクセスする

  5. 5

    NodeJSサーバーのクライアントから受信したデータを印刷します

  6. 6

    クライアント/サーバーチャット、オンラインユーザーリストの送信、最後に接続したクライアントによってのみ受信されましたか?

  7. 7

    サーバーからTLSアラートを受信しました:ハンドシェイクに失敗しました(40)

  8. 8

    クライアントからSYNを受信した直後にサーバーがSYN / ACKを送信する

  9. 9

    javascriptクライアントをpythonwebsocketサーバーに接続します

  10. 10

    nettyでアプリケーションを作成し、クライアントからサーバーにメッセージを送信しましたが、サーバーがメッセージを受信できません

  11. 11

    クライアントをサーバーに接続し、C#でクライアントからテキストファイルを取得します

  12. 12

    クライアント側から受信したGoogle認証コードを使用して、サーバー側のJavaScript(nodejs)でアクセストークンを取得します

  13. 13

    サーバーのソケットとCのクライアントアプリケーションを介してJSONを送受信します

  14. 14

    mbedtlsサンプルクライアントを使用してhttpsサーバーに接続できません

  15. 15

    クライアントごとに複数のUDP接続を使用してJavaサーバーを作成する

  16. 16

    インターネットにアクセスできるローカル サーバーを介して、クラウド上のプライベート仮想マシンからインターネットに接続する必要がある

  17. 17

    Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

  18. 18

    SignalRはサーバーからクライアントに接続します

  19. 19

    APIから受信したデータを更新するためにどのコンポーネントライフサイクルを使用しますか

  20. 20

    c#クライアントはprotobufを使用してJava nettyサーバーに接続します

  21. 21

    レンダラーからのメッセージの受信がタイムアウトしました:WindowsのJenkinsを介してchromedriverとchromeを使用してスクリーンショットをキャプチャしているときに10.000

  22. 22

    1つのクライアントが受信したメッセージを、サーバーに接続されている他のすべてのクライアントに送信できません

  23. 23

    クライアントが受信したときにサーバーからバイト配列を返すのは異なります

  24. 24

    C#クライアント上のC ++サーバーから送信されたデータを受信します

  25. 25

    Javaクライアントを使用してMQチャネルに接続しています:CERTLABLエラー

  26. 26

    WithBlock()オプションを使用してgRPCクライアント接続を作成し、非同期で開始されたgRPCサーバーを無期限にブロックしますか?

  27. 27

    プロキシサーバーを使用してクライアントに接続する

  28. 28

    C ++ APIを使用して暗号化されたチャネルでmqクライアントをmqサーバーに接続する

  29. 29

    C#クライアントからサーバーへのデータ転送サーバーは以前のクライアントメッセージを受信しています非同期サーバー-非同期クライアント

ホットタグ

アーカイブ