クロスプラットフォーム モバイル アプリケーションを構築しています (Xamarian ツール、MonoTouch/MonoDroid を使用)。認証ワークフローを実行しようとしていますが、つまずきに直面しています。私は明確な答えを求めてあちこち探しましたが、まだ見つけていません。
これが私の現在のセットアップの概要です。
nodejsで構築されたWebサイトがあります。私は、web サイトで oAuth ログインを行うために、passport.js を使用しています。これはうまく機能し、ユーザーは Twitter または Facebook を使用して私のサイトにログインできます。
今度は、この同じログイン機能をモバイル クライアントに拡張したいと考えています。
2 つのオプションが表示されます
アプリ ID とアプリ シークレットをモバイル クライアントに埋め込み、モバイル アプリから FB または Twitter に直接 oAuth 呼び出しを行う
既存のnodejs Webサーバーを介してoAuth呼び出しをプロキシします(サーバーに秘密鍵を保持します)
オプション 2 が推奨される方法のようです (モバイル アプリでシークレットを「出荷」する必要がなくなるため)。
私はプロキシアプローチをほとんど機能させています。
- モバイル クライアントで WebView を開き、
http://mysever/auth/twitter
- これは、既存の Passport.js コードを介して実行され、モバイル WebView を Twitter ログイン ページにリダイレクトします。
- 次に、ユーザーはデバイスの Twitter Web ページで自分の資格情報を入力します。
- 次に、Twitter は私の oAuth コールバック URL (私の nodejs Web サーバー) を呼び出します。
- 私のサーバーと Twitter は、ユーザー プロファイル情報を取得するための 4 回目のハンドシェイクを処理します (私が理解しているように、これがこのアプローチの鍵です。私のサーバーと Twitter がハンドシェイクを処理します。モバイル クライアントは何もする必要もパスする必要もありません)。このプロセス中のすべてのトークン)
ここに私の問題があります:
私を悩ませているのは、この最後のステップです。サーバー上でハンドシェークが完了すると、必要なユーザー情報がサーバー上にあり、それをモバイル クライアント アプリケーションに送り返す必要があります。
WebView コントロールで応答オブジェクトを取得し、Cookie またはヘッダー値 (たとえば) を取得する方法がわかりません (これは Android と iOS に当てはまります)。プラットフォーム固有ではないと思います。モバイル プラットフォームの WebView ウィジェットがサポートしていないことをしようとしていると思います。明らかな何かが欠けていると思います。
私が見つけた唯一のことは、Web サーバーがモバイル クライアント ブラウザをクエリ文字列にユーザー情報を持つ偽の URL に「リダイレクト」することです。myapp://info?userid=1234 のようなもの
次に、モバイル アプリで URL の読み込みをハイジャックし、この URL を取得して必要なデータを取得します。次に、この userinfo を隠し、WebView コントロールを閉じて、モバイル アプリケーションのネイティブ画面に移動し、ユーザーを識別する手段として、nodejs サーバーへの後続の REST 呼び出しで userinfo を使用します。
これは、複数の理由で非常に厄介です。その最大の問題は、URL が暗号化されずにネットワーク経由で送信され、すべてのデータがプレーン テキストであることです。
Web サーバーからモバイル クライアントにデータを戻すためのより良い方法が必要ですか?
それとも、私はそれをすべて間違っていますか?