現在、AngularJSベースのアプリケーションをRuby on Railsで作成し、認証にDeviseを使用しています。ユーザーが正常に認証されるとサーバーが正しく応答します認証が失敗した場合、私の質問は、$ cookieStoreを使用して、ユーザーがログインしているかどうかを知るためのベストプラクティスは何でしょうか?Rails called "しかし、そのセッションは必ずしもユーザーがログインしていることを意味するわけではありません。AngularJSを使用してユーザーをオンライン/オフライン管理する方法についてのアイデアを探しています。承認を必要とするリクエストは、ソリューションの。
たとえば、サーバー上の現在のユーザーセッションを要求するなど、アプリケーションの読み込み時にログに記録されるユーザーを設定するディレクティブを作成できます。
_angular.module('Auth', [
'ngCookies'
])
.factory('Auth', ['$cookieStore', function ($cookieStore) {
var _user = {};
return {
user : _user,
set: function (_user) {
// you can retrive a user setted from another page, like login sucessful page.
existing_cookie_user = $cookieStore.get('current.user');
_user = _user || existing_cookie_user;
$cookieStore.put('current.user', _user);
},
remove: function () {
$cookieStore.remove('current.user', _user);
}
};
}])
;
_
run
のAppController
メソッドで設定します。
_ .run(['Auth', 'UserRestService', function run(Auth, UserRestService) {
var _user = UserRestService.requestCurrentUser();
Auth.set(_user);
}])
_
もちろん、サーバーへのリクエストが_Http Status 401 - Unauthorized
_を返す場合、Auth.remove()
サービスを呼び出してCookieからユーザーを削除し、ユーザーをログインページにリダイレクトする必要があります。
私はこのアプローチを使用しており、非常にうまく機能しています。 localStorage
を使用することもできますが、ユーザーデータは長期間保持されます。この認証の有効期限を設定しない限り、ベストプラクティスとは思えません。
サーバーサイトのユーザー資格情報を常に確認することに注意してください=)
[編集]
_401 - Unauthorized
_サーバーの応答をリッスンするには、次のように_$http
_要求にインターセプターを配置できます。
_ .config(['$urlRouterProvider', '$routeProvider', '$locationProvider', '$httpProvider', function ($urlRouterProvider, $routeProvider, $locationProvider, $httpProvider) {
$urlRouterProvider.otherwise('/home');
var interceptor = ['$location', '$q', function ($location, $q) {
function success(response) {
return response;
}
function error(response) {
if (response.status === 401) {
$location.path('/login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function (promise) {
return promise.then(success, error);
};
}];
$httpProvider.responseInterceptors.Push(interceptor);
}])
_
_401
_応答を伴う呼び出しごとに、ユーザーは_/login
_パスのログインページにリダイレクトされます。
良い例があります here
ログインコールバックでCookieを設定できます
$cookieStore.put('logged-in', some_value)
次に、彼らがあなたのサイトに入るときにそれをチェックします
.run(function($cookieStore) {
if ($cookieStore.get('logged-in') === some_value) {
let him enter
}
else {
you shall not pass
}
});
もっと「正しい」方法があるかもしれませんが、これは機能します。
Angular 1.3の時点で、新しいインターセプターを追加する適切な方法は$ httpProvider.interceptorsに追加することです。の:
$httpProvider.responseInterceptors.Push(interceptor);
使用する:
$httpProvider.interceptors.Push(interceptor);