web-dev-qa-db-ja.com

シングルページアプリのユーザーの認証?

フロントエンドでバックボーンを使用しており、サーバーの薄いRESTful APIからデータを消費する単一ページアプリのプロトタイプを開発しました。

重いサーバー側アプリケーション開発(phpおよびpython)から来た私は、シッククライアント側MVCを使用した新しい異なる設計アプローチを本当に楽しんでいますが、アプリをログインする認証済みユーザーに制限する最善の方法に戸惑っています。

私はアプリ自体をログインの背後に置き、サイトのネイティブログインに加えて他のタイプのログイン(openid、fb connectなど)も実装したいと考えています。これがどのように行われるかは不明であり、検索してきましたが、それを明らかにする情報を見つけることができませんでした。

全体像として、ユーザーを登録し、シングルページアプリを使用するためにユーザーにログインを要求するための現在のベストプラクティスは何ですか?

ユーザーがログインしたら、APIリクエストはどのように認証されますか?セッションを保存できますが、API呼び出しでこのセッションをどのように検出しますか、またはすべてのAPI呼び出しで渡す必要があるトークンはありますか?これに対するどんな答えでも大歓迎です!

39
John Haldson

私が見た中で最もRESTfulな方法は、OAuthクライアント資格情報フロー、基本的には、ユーザー名/パスワードをポストするこのトークンエンドポイントに基づいており、このセッションにアクセストークンを返します。その後のすべてのajaxリクエストトークンにAuthorizationベアラーヘッダーを追加します。トークンをグローバル変数に保存して、ページが更新またはクローズされるまでトークンを保持するか、ローカルストレージを使用してセッション間でユーザーをログインさせ続けるか、JavaScript cookie。トークンの概念が気に入らない場合は、とにかくajaxリクエストで自動的に送信される古いcookieアプローチを使用できます。

Facebook/googleなどに関しては、私は通常、stackoverflowアプローチに従い、外部のユーザーログインをアカウントに関連付けます。次に、かなり通常のサーバーベースのoauthダンスを使用します(サーバーへのすべての要求をajax要求に少し変更して置き換えることができますが、リダイレクトが必要なため、それほど大きな違いはないことがわかりました。とにかくあなたとサーバーの間。私は通常、Facebookのログイン用に暗号化されたCookieを発行し、それを上記と同様の方法を使用してトークンに変換します(ユーザー名/パスワードの代わりにリクエストでCookieを送信するだけです)。

10
Betty

Django= cookieベースの認証を使用しており、ログイン用とsingle-page-app用に別々のページがあります。私たちのユースケースではかなりうまくいきます。バックボーンベースのセッション管理システムを使用しました私がここで説明したこと: backbone.js-ユーザーがログインしているかどうかの処理

9
Jens Alm

Angular.jsを使用しており、ログイン用の別のページもあります。別のページは、http XHR要求を使用してサーバーを呼び出し、ユーザー名とパスワードを送信する別の単一ページ(および安全な)アプリケーションをロードします。サーバーが資格情報を認証した場合、JavaScriptコードはCookieを設定します。このCookieは「反対側」、つまり安全でないアプリケーションから読み取ることができます。 Cookieにはユーザー名のみを入れ、もちろんパスワードやその他の安全な情報は入れません。次に、「Liorではない?安全でないアプリでログアウトします。

注意すべきことは、AngularのCookieメカニズムをオーバーライドして、無期限の有効期限を設定し、最も重要なのはルートパスを設定することです。

$document[0].cookie = 'username=' + escape($scope.userName) + ";expires=Thu, 01 Jan 2970 00:00:00 GMT; Path=/";
4
Lior