私はangular jsアプリで認証システムを実装しています。
私はそれを以下のように計画しています:
MyApp.service( 'myAuth'、function($ http、$ q){ this.authHeader = null; this.checkAuth = function(){ // APIコールを行い、成功するとthis.authHeader = response } this.isAuthenticaed = function(){ this.authHeader?return this.authHeder:return false ; }
ログインフォームを送信した後、checkAuthを呼び出してサーバーからセッションCookieを取得します。次のREST呼び出しと、ユーザーがアプリケーション全体をナビゲートするときのCookie情報の追加方法ログイン後、isAuthenticaedがtrueまたはfalseになるたびに確認したいのですが、Angularjsで別のページに移動すると、最初の呼び出しからtrueに設定した後にリセットされますか?ところで、私は以前にエントリーをチェックしたので、エントリーは知りたいものではありません。
あなたのバックエンドについてはわかりませんが、これは私がそれをする方法です
これにより、Angularのクライアント側で認証を管理するために必要なコードが節約されます。ユーザーがこのページにアクセスすると、ユーザーは認証され、Cookieを取得します。
また、ブラウザのデフォルトの動作では、各リクエストでドメインに関連付けられたすべてのCookieが送信されるため、angularがCookieを送信するかどうかを心配する必要はありません。
Http-auth-interceptorを使用します。 http://ngmodules.org/modules/http-auth-interceptor
バックエンド(asp.net mvc)で簡単な認証サービスを構築し、httpエラーを返します401
ユーザーが認証されていない場合。次に、SPAサイトのログインビューでエラーを処理します。
前の回答で出されたアイデアは機能しますが、私はそれらがやり過ぎだと思います。この複雑なものは何も必要ありません。
次のREST呼び出しをしながら、Cookie情報を追加する方法
withCredentials
をデフォルトで_$httpProvider
_の内部でオンにします:
_app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.withCredentials = true;
}]);
_
次に、CORS関連のヘッダーからワイルドカード(ある場合)を削除し、サーバー側でallow-credentialsを設定します。私の場合、Python + Flask + Flask-Restful を使用すると、非常に簡単で次のようになります。
_import Flask
from flask_restful import Api
app = Flask(__name__)
api = Api(app)
api.decorators = [cors.crossdomain(Origin='http://localhost:8100', credentials=True)]
_
これで、Cookieがブラウザによって自動的かつ透過的に設定および返されます。詳細については、これらのスレッドを参照してください。
ログイン後にユーザーがアプリケーション全体をナビゲートするときisAuthenticaed trueまたはfalseを毎回確認したい
上記で提案したように、認証セッションが期限切れまたは削除された場合、サーバーに401を返させ、_$httpInterceptor
_ in Angularを使用して次のようにキャッチします。
_app.config(function($httpProvider) {
var interceptor =
function($q, $rootScope) {
return {
'response': function(response) {
return response;
},
'responseError': function(rejection) {
if (rejection.status==401) {
// Modify this part to suit your needs.
// In my case I broadcast a message which is
// picked up elsewhere to show the login screen.
if (!rejection.config.url.endsWith('/login'))
{
$rootScope.$broadcast('auth:loginRequired');
}
}
return $q.reject(rejection)
}
}
};
$httpProvider.interceptors.Push(interceptor);
});
_
(開示:私はUserAppの開発者の1人です)
サードパーティのサービス serApp を AngularJSモジュール とともに使用できます。
スタートガイド を確認するか、 Codecademyのコース を受講してください。動作の例を次に示します。
エラー処理を伴うログインフォーム:
_<form ua-login ua-error="error-msg">
<input name="login" placeholder="Username"><br>
<input name="password" placeholder="Password" type="password"><br>
<button type="submit">Log in</button>
<p id="error-msg"></p>
</form>
_
ユーザー情報には、user
サービスを使用してアクセスします:_user.current.email
_
またはテンプレートで:_<span>{{ user.email }}</span>
_
エラー処理を伴う登録フォーム:
_<form ua-signup ua-error="error-msg">
<input name="first_name" placeholder="Your name"><br>
<input name="login" ua-is-email placeholder="Email"><br>
<input name="password" placeholder="Password" type="password"><br>
<button type="submit">Create account</button>
<p id="error-msg"></p>
</form>
_
_ua-is-email
_は、ユーザー名がメールと同じであることを意味します。
どのルートを公開するか、どのルートをログイン形式にするかを指定する方法:
_$routeProvider.when('/login', {templateUrl: 'partials/login.html', public: true, login: true});
$routeProvider.when('/signup', {templateUrl: 'partials/signup.html', public: true});
_
.otherwise()
ルートは、ログイン後にユーザーをリダイレクトする場所に設定する必要があります。例:
$routeProvider.otherwise({redirectTo: '/home'});
ログアウトリンク:
_<a href="#" ua-logout>Log Out</a>
_
ログイン時にのみ表示される要素を非表示にします:
_<div ng-show="user.authorized">Welcome {{ user.first_name }}!</div>
_
また、バックエンドサービスに対して認証するには、user.token()
を使用してセッショントークンを取得し、AJAXリクエストで送信します。バックエンドで-を使用します。 serApp API トークンが有効かどうかを確認します。
助けが必要な場合は、私に知らせてください:)