Passport.jsを使用して、WebインターフェースではなくRESTful APIを介して、認証(ローカルおよびFacebookなど)をどのように処理しますか?
具体的な懸念事項は、コールバックからRESTfulレスポンス(JSON)へのデータの受け渡しと、典型的なres.send({data:req.data})の使用、Facebookにリダイレクトする初期/ loginエンドポイントのセットアップ(/ loginはできません)これはJSON応答ではないため、AJAXを介してアクセスされます-これは、コールバックを使用したFacebookへのリダイレクトです。
https://github.com/halrobertson/test-restify-passport-facebook が見つかりましたが、理解するのに苦労しています。
さらに、passport.jsはどのように認証資格情報を保存しますか?サーバー(またはサービスですか?)はMongoDBによってサポートされており、資格情報(ログインおよびpwのソルトハッシュ)が格納されると予想されますが、passport.jsにこのタイプの機能があるかどうかはわかりません。
ここでは多くの質問がありますが、質問はNodeおよびpassport.jsのコンテキストで質問されますが、実際の質問は特定のテクノロジーでこれを行う方法よりもワークフローに関するものです。
セキュリティを強化するために少し変更した@Keithサンプルセットアップを使用しましょう。
https://example.com
のWebサーバーは、単一ページのJavascriptクライアントアプリを提供しますhttps://example.com/api
のRESTful Webサービスは、リッチクライアントアプリにサーバーサポートを提供しますhttps://example.com/api
にしますhttps://example.com/api
のWebサービスを使用するが、https://example.com
のWebサーバーについては知らない他のクライアント(たとえば、電話アプリ)が存在する場合があります。セキュアHTTPを使用していることに注意してください。これは、パスワードや認証トークンなどの機密情報がクライアントとサーバー間で渡されるため、公開で利用可能なサービスには必須です。
最初にプレーンな古い認証がどのように機能するかを見てみましょう。
https://example.com
に接続しますhttps://example.com/api
でRESTful APIに1つ以上のリクエストを送信して、ページに表示するユーザー固有のデータを取得する必要があります。 Webサービスに送信するすべてのリクエストには、おそらくHTTP Basic 認証の形式のユーザー名とパスワードが含まれます。これは、RESTfulであるサービスが1つのリクエストからクライアントの状態を維持できないためです。次。 Webサービスは安全なHTTP上にあるため、パスワードは送信中に安全に暗号化されます。https://example.com/api
のWebサービスは、それぞれ認証情報を含む一連の個別のリクエストを受け取ります。各リクエストのユーザー名とパスワードは、ユーザーデータベースと照合され、見つかった場合、リクエストされた関数が実行され、データがJSON形式でクライアントに返されます。ユーザー名とパスワードが一致しない場合、エラーは401 HTTPエラーコードの形式でクライアントに送信されます。この例からの重要なポイントは、RESTful Webサービスでは、すべてのリクエストで認証が必要なことです。
このシナリオで追加のセキュリティ層を使用すると、ユーザー認証に加えてクライアントアプリケーションの承認が追加されます。たとえば、すべてのWebサービスを使用するWebクライアント、iOSおよびAndroidアプリがある場合、認証されたユーザーが誰であるかに関係なく、特定のリクエストのクライアントが3つのうちどれであるかをサーバーに知らせることができますです。これにより、Webサービスが特定の機能を特定のクライアントに制限できるようになります。これについては、APIキーとシークレットを使用できます。 this answer を参照してください。
Facebook経由のログインにはサードパーティであるFacebook自体があるため、上記のワークフローはFacebook接続では機能しません。ログイン手順では、ユーザーがFacebookのWebサイトにリダイレクトされる必要があり、そこでは資格情報が当社の制御外で入力されます。
それでは、物事がどのように変化するかを見てみましょう。
https://example.com
に接続しますhttps://example.com/auth/facebook
にリダイレクトする単なるリンクです。https://example.com/auth/facebook
ルートはpassport.jsによって処理されます( documentation を参照)https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
ルートのpassport.jsハンドラーは、Facebookのアクセストークンと、ユーザーの電子メールアドレスを含むFacebookからのユーザー情報を受け取るコールバック関数を呼び出します。https://example.com/api
に送信されるすべてのリクエストには、認証用のFacebookアクセストークン、またはREST APIの「get_access_token」関数を介してFacebookのトークンから生成されたアプリケーション独自のアクセストークンが含まれます。これでほとんどの質問に答えられることを願っています。もちろん、FacebookをTwitter、Google、またはその他のOAuthベースの認証サービスに置き換えることができます。
誰かがこれに対処する簡単な方法を持っているかどうかを知りたいと思います。
@Miguelの各ケースの完全なフローの説明に非常に感謝していますが、Facebook Authenticationの部分にいくつか追加したいと思います。
Facebookは Javascript SDK を提供します。これを使用してクライアントエンドで直接アクセストークンを取得し、サーバーに渡して、Facebookからすべてのユーザー情報をさらに取得するために使用できます。したがって、基本的にリダイレクトは必要ありません。
さらに、モバイルアプリケーションにも同じAPIエンドポイントを使用できます。 FacebookのAndroid/iOS SDKを使用し、クライアント側でFacebookのaccess_tokenを取得してサーバーに渡します。
説明したステートレスの性質に関して、get_access_tokenを使用してトークンを生成し、クライアントに渡すと、このトークンもサーバーに保存されます。それで、セッショントークンと同じくらい良いです、そして、これがそれをステートフルにすると思いますか?
ちょうど私の2セント。