9

クロスプラットフォーム モバイル アプリケーションを構築しています (Xamarian ツール、MonoTouch/MonoDroid を使用)。認証ワークフローを実行しようとしていますが、つまずきに直面しています。私は明確な答えを求めてあちこち探しましたが、まだ見つけていません。

これが私の現在のセットアップの概要です。

nodejsで構築されたWebサイトがあります。私は、web サイトで oAuth ログインを行うために、passport.js を使用しています。これはうまく機能し、ユーザーは Twitter または Facebook を使用して私のサイトにログインできます。

今度は、この同じログイン機能をモバイル クライアントに拡張したいと考えています。

2 つのオプションが表示されます

  1. アプリ ID とアプリ シークレットをモバイル クライアントに埋め込み、モバイル アプリから FB または Twitter に直接 oAuth 呼び出しを行う

  2. 既存のnodejs Webサーバーを介してoAuth呼び出しをプロキシします(サーバーに秘密鍵を保持します)

オプション 2 が推奨される方法のようです (モバイル アプリでシークレットを「出荷」する必要がなくなるため)。

私はプロキシアプローチをほとんど機能させています。

  1. モバイル クライアントで WebView を開き、http://mysever/auth/twitter
  2. これは、既存の Passport.js コードを介して実行され、モバイル WebView を Twitter ログイン ページにリダイレクトします。
  3. 次に、ユーザーはデバイスの Twitter Web ページで自分の資格情報を入力します。
  4. 次に、Twitter は私の oAuth コールバック URL (私の nodejs Web サーバー) を呼び出します。
  5. 私のサーバーと Twitter は、ユーザー プロファイル情報を取得するための 4 回目のハンドシェイクを処理します (私が理解しているように、これがこのアプローチの鍵です。私のサーバーと Twitter がハンドシェイクを処理します。モバイル クライアントは何もする必要もパスする必要もありません)。このプロセス中のすべてのトークン)

ここに私の問題があります:

  1. 私を悩ませているのは、この最後のステップです。サーバー上でハンドシェークが完了すると、必要なユーザー情報がサーバー上にあり、それをモバイル クライアント アプリケーションに送り返す必要があります。

    WebView コントロールで応答オブジェクトを取得し、Cookie またはヘッダー値 (たとえば) を取得する方法がわかりません (これは Android と iOS に当てはまります)。プラットフォーム固有ではないと思います。モバイル プラットフォームの WebView ウィジェットがサポートしていないことをしようとしていると思います。明らかな何かが欠けていると思います。

私が見つけた唯一のことは、Web サーバーがモバイル クライアント ブラウザをクエリ文字列にユーザー情報を持つ偽の URL に「リダイレクト」することです。myapp://info?userid=1234 のようなもの

次に、モバイル アプリで URL の読み込みをハイジャックし、この URL を取得して必要なデータを取得します。次に、この userinfo を隠し、WebView コントロールを閉じて、モバイル アプリケーションのネイティブ画面に移動し、ユーザーを識別する手段として、nodejs サーバーへの後続の REST 呼び出しで userinfo を使用します。

これは、複数の理由で非常に厄介です。その最大の問題は、URL が暗号化されずにネットワーク経由で送信され、すべてのデータがプレーン テキストであることです。

Web サーバーからモバイル クライアントにデータを戻すためのより良い方法が必要ですか?

それとも、私はそれをすべて間違っていますか?

4

2 に答える 2

3

iOS と Android の両方で Xamarin に oauth を実装する最も簡単な方法は、Xamarin.Authを使用することです。クライアントのスターター ドキュメントはこちらです。すべてを安全に維持する必要があり、ノード サーバーをプロキシとして使用しなければならないことを心配する必要はないと思います。

呼び出しの一部としてアプリケーション ID を提供する必要がありますが、心配するセキュリティの問題はあまりありません。

これはあなたがすでに実装したものに反していることは知っていますが、これは物事を少し簡素化するのに役立つかもしれません.

于 2013-02-14T23:55:29.020 に答える
0

これは、私が取り組んできたのと同じジレンマです。これが私が現在それに対処している方法です。私のアプリでは、クライアントは直接、または私のメインのサービスである facebook などの別のサービスを介してアクセスできます。

Facebook は、POST (デスクトップ アプリ) または GET (モバイル) を介してリダイレクトできます。

最初のリクエストをチェックして、サービス識別子があるかどうかを確認します。たとえば、facebook GET を次に示します。

app.get('/', function(req, res) {
var paraUrl = URL.parse(req.url,true).query;
//The fb_source is shown - 
//i need to go striaght to the facebook authorization since 
//its coming from
//from a mobile device.
if (paraUrl.fb_source){
res.redirect('/auth/facebook'); //this is the passport part
return;
}
res.sendfile('index.html');
}

facebook POST は、base64url でエンコードされたアクセス トークンを取得するという点で少し異なります。GET は、アクセス トークンと交換できるコードを提供しますが、私はそれに問題があり、パスポート システムに結び付けることを選択しました。

クライアントが直接来たら、ローカル戦略に結びつくセッションまたは暗号化された Cookie をチェックします。これにより、たとえば facebook API へのアクセスに使用できるアクセス トークンのデータベースがチェックされます。

クライアントが認識されない場合、Facebook、Google などを介して認証するオプションが与えられます。

主なことは、パスポートセッションIDとアプリユーザーIDの2つの情報のみがクライアントに保存されることです

connect.sid - 暗号化された Cookie

userId - 暗号化された Cookie

他の人が問題にどのように対処しているかを知りたい

于 2013-02-15T08:07:11.540 に答える