2017-02-08 4 views
0

私のシナリオでは、バックエンドサーバーを搭載したAndroidアプリケーションを使用しています。指定された資格情報を持つアカウントを設定する代わりに、Googleを使用してサインインする機能を実装しています。独自のバックエンドAPIを使用するモバイルAndroidアプリケーションのコンテキストでのリダイレクトURIの役割は何ですか?

サーバー側で、私はLoopBackを使用しています。これは、OAuth2のNode/Express Passportライブラリを使用しています。 Android側では、Googleの最新のサインインライブラリを使用しています。

Androidサインインライブラリは、ログインするGoogleアカウントを選択するようにユーザーに促す処理をすべて行います。これが成功すると、ライブラリは私にサーバー認証トークンを提供します。

このサーバー認証トークンは、その後の私をログに記録し、私のバックエンド、で...トークン?/認証/ /コールバックをGoogleに渡す=することができる。

をこれまでのところ、このすべてがに動作しますエクステント。これまでのところ、バックエンドは開発マシン上で動作します。 Google APIコンソールでは、OAuth2キーのコールバックURIはhttp://localhost:3000/auth/google/callbackを指しています。具体的には、私のAndroidアプリで、私は正常に認証トークンを取得します。私は手動で私の開発マシン上でhttp://localhost:3000/auth/google/callbackにGETするPostmanにこれを貼り付けると正常に認証されます。しかし、アプリケーション自体がトークンをサーバーアプリケーションに渡すようにパズルの最後の部分を完了しようとすると、リダイレクトURIの不一致エラーが発生します。これは、私が仮定することができるのは、同じマシン上のPostmanからのHTTP要求には、ホストヘッダーに「localhost」が含まれているためです。しかし、何かからの要求は、マシンのLAN IPをホストヘッダーに持っています。

私はOAuth2の流れをよく理解していますが、コールバックの目的は、Webアプリケーションのコンテキストで認証トークンをサーバーに送り返すことですアプリケーションがauthトークンを受け取り、トークンをバックエンドのコールバックURI自体に渡すタスクを実行する場合のコールバックURIの妥当性を理解する。

第2に、正常に認証トークンを開発サーバーに渡して正常に認証できますか? Google APIコンソールでlocalhostを指定できますが、明らかにLAN IPは指定できません。

+0

ここにチェックして、これがあなたの質問に答えるかどうかを確認してください:http://stackoverflow.com/questions/28731646/google-oauth-2-0-redirect-uri-mismatch-error-for-cross-client-single-sign -on –

+0

また、私はあなたの質問のすべてに答えることはできませんが、リダイレクトエラーに気づかれる可能性が高いことを認識しています。 –

+0

@ChantellOsejoご意見ありがとうございました。私は今夜​​作ったいくつかの調査結果の後に自分自身で回答を掲載しましたが、さらなる考えと助けに感謝します。 – Trevor

答えて

0

これは、LoopBackのproviders.jsonファイル内に存在するcallbackURLプロパティがPassport構成の一部として行うことです。

最初は/auth/google/callbackに設定しました。今、私は仮定することができるものから、このプロセスが起こる:

  • 私はループバックアプリケーションに認証トークンを提出する開発マシン上でポストマンを使用する場合は、パスポートは/auth/google/callbackからlocalhost:3000を追加します。したがって、PassportがGoogleサーバーに要求を行うと、それが形成した完全なコールバックURIがAPIコンソール(http://localhost:3000/auth/google/callback)のホワイトリストに登録されたコールバックURIと一致し、要求は成功します。

  • 私のLAN上の他のデバイス(Androidデバイス)は、自分の開発マシンでLoopBackアプリケーションを実行しているHTTPリクエストを作成します。次に、PassportがHTTP hostヘッダー(私のマシンの192.168.x.x IP)にあるものから絶対コールバックURIを構築し、/auth/google/callbackを追加していると仮定することしかできません。したがって、http://192.168.x.x:3000/auth/google/callbackhttp://localhost:3000/auth/google/callbackと一致しないため、PassportからGoogleへのリクエストが失敗します。 Passportが相対callbackURLで設定されている場合は、おそらくreq.headers.hostなどで連結されていると思います。私は開発と生産の両方で実行されるアプリケーションを構成変更する必要なしにしたいと思うが、devopmentサーバーに対してAndroidアプリを使用したいときにはスパナをスローします。

ので、サーバアプリが正常にグーグルで償還する私の開発マシン上のサーバアプリケーションに認証トークンを提出するAndroidデバイスを可能にするという点で、作品一つの解決策は、私がコールバックを持たないようにするためにありますAPIコンソールで定義されたURI、およびcallbackURLパラメーターがPassport構成から省略されていることを確認します。しかし、この問題は、従来のWebサインインが機能しないということです(GoogleのWebページには、コールバックURIがないことを示す400のエラーがあるため)。

代わりにを絶対http://localhost:3000/auth/google/callback(相対的なものではなく)に設定し、コールバックURIとしてAPIコンソールに設定します。この方法では、サーバーアプリケーションのWebフロントエンド、をAndroidアプリケーションからも認証してサインインすることができます。

私がしなければならないことは絶対的なcallbackURLの環境設定を使うことです。

関連する問題