101

私はAngularJSを初めて使用し、彼らのチュートリアルを読み、その感触をつかみました。

REST各エンドポイントを認証する必要があるプロジェクトのバックエンドが用意されています。

やりたいこと
a.) プロジェクト用に 1 つのページを作成したいhttp://myproject.com
b.) ユーザーがブラウザで URL にアクセスすると、ユーザーがログインしているかどうかに基づいて、同じ URL の下にホームページ/ビューまたはログイン ページ/ビューが表示されますhttp://myproject.com
c.) ユーザーがログインしていない場合、ユーザーはフォームに入力し、サーバーはUSER_TOKENセッションを設定するため、エンドポイントへの以降のすべての要求は、に基づいて認証されます。USER_TOKEN

私の混乱
a.) AngularJS を使用してクライアント側の認証を処理するにはどうすればよいですか? 私はここここを見ましたが、それらの使用方法を理解していませんでした
http://myproject.com

初めて angular.js を使用していますが、開始方法について本当に混乱しています。アドバイスやリソースは大歓迎です。

4

6 に答える 6

48

この記事を基本的にまとめた github リポジトリを作成しました: https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec

ng-login Github リポジトリ

プランカー

できる限り詳しく説明するように努めます。皆さんの助けになれば幸いです。

(1) app.js:アプリ定義での認証定数の作成

var loginApp = angular.module('loginApp', ['ui.router', 'ui.bootstrap'])
/*Constants regarding user login defined here*/
.constant('USER_ROLES', {
    all : '*',
    admin : 'admin',
    editor : 'editor',
    guest : 'guest'
}).constant('AUTH_EVENTS', {
    loginSuccess : 'auth-login-success',
    loginFailed : 'auth-login-failed',
    logoutSuccess : 'auth-logout-success',
    sessionTimeout : 'auth-session-timeout',
    notAuthenticated : 'auth-not-authenticated',
    notAuthorized : 'auth-not-authorized'
})

(2) Auth サービス: auth.js サービスには、以下のすべての機能が実装されています。$http サービスは、認証手順のためにサーバーと通信するために使用されます。ユーザーが特定のアクションの実行を許可されている場合、承認に関する機能も含まれています。

angular.module('loginApp')
.factory('Auth', [ '$http', '$rootScope', '$window', 'Session', 'AUTH_EVENTS', 
function($http, $rootScope, $window, Session, AUTH_EVENTS) {

authService.login() = [...]
authService.isAuthenticated() = [...]
authService.isAuthorized() = [...]
authService.logout() = [...]

return authService;
} ]);

(3) セッション:ユーザーデータを保持するためのシングルトン。ここでの実装はあなた次第です。

angular.module('loginApp').service('Session', function($rootScope, USER_ROLES) {

    this.create = function(user) {
        this.user = user;
        this.userRole = user.userRole;
    };
    this.destroy = function() {
        this.user = null;
        this.userRole = null;
    };
    return this;
});

(4) 親コントローラー:これをアプリケーションの「メイン」機能と見なしてください。すべてのコントローラーはこのコントローラーから継承し、このアプリの認証のバックボーンです。

<body ng-controller="ParentController">
[...]
</body>

(5) アクセス制御:特定のルートでのアクセスを拒否するには、2 つの手順を実装する必要があります。

a) 以下に示すように、UI ルーターの $stateProvider サービスで、各ルートへのアクセスを許可されたロールのデータを追加します (同じことが ngRoute でも機能します)。

.config(function ($stateProvider, USER_ROLES) {
  $stateProvider.state('dashboard', {
    url: '/dashboard',
    templateUrl: 'dashboard/index.html',
    data: {
      authorizedRoles: [USER_ROLES.admin, USER_ROLES.editor]
    }
  });
})

b) $rootScope.$on('$stateChangeStart') で、ユーザーが承認されていない場合に状態の変更を防ぐ関数を追加します。

$rootScope.$on('$stateChangeStart', function (event, next) {
    var authorizedRoles = next.data.authorizedRoles;
    if (!Auth.isAuthorized(authorizedRoles)) {
      event.preventDefault();
      if (Auth.isAuthenticated()) {
        // user is not allowed
        $rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
      } else {
        // user is not logged in
        $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
      }
    }
});

(6) 認証インターセプター:これは実装されていますが、このコードのスコープではチェックできません。各 $http リクエストの後、このインターセプターはステータス コードをチェックし、以下のいずれかが返された場合、イベントをブロードキャストして、ユーザーに再度ログインを強制します。

angular.module('loginApp')
.factory('AuthInterceptor', [ '$rootScope', '$q', 'Session', 'AUTH_EVENTS',
function($rootScope, $q, Session, AUTH_EVENTS) {
    return {
        responseError : function(response) {
            $rootScope.$broadcast({
                401 : AUTH_EVENTS.notAuthenticated,
                403 : AUTH_EVENTS.notAuthorized,
                419 : AUTH_EVENTS.sessionTimeout,
                440 : AUTH_EVENTS.sessionTimeout
            }[response.status], response);
            return $q.reject(response);
        }
    };
} ]);

PS 1回目の記事で述べたフォームデータ自動入力のバグは、directives.jsに含まれるディレクティブを追加することで簡単に回避できます。

PS2このコードは、ユーザーが簡単に微調整して、さまざまなルートを表示したり、表示されることを意図していないコンテンツを表示したりできます。ロジックはサーバー側で実装する必要があります。これは、ng-app で適切に表示する方法にすぎません。

于 2014-10-05T09:20:07.330 に答える
25

私はこのアプローチが好きで、フロントエンドで認証関連のことを何もせずにサーバー側に実装しました

私の最新のアプリでの私の「テクニック」は..クライアントは認証を気にしません。アプリ内のすべてのことは最初にログインを必要とするため、セッションで既存のユーザーが検出されない限り、サーバーは常にログイン ページを提供します。session.user が見つかった場合、サーバーは単に index.html を送信します。バム :-o

「Andrew Joslin」のコメントを探してください。

https://groups.google.com/forum/?fromgroups=#!searchin/angular/authentication/angular/POXLTi_JUgg/VwStpoWCPUQJ

于 2013-04-25T22:11:40.240 に答える
14

ここで同様の質問に答えました: AngularJS Authentication + RESTful API


保護された/パブリック ルート、ログイン/ログアウト時の再ルーティング、ステータス チェック用のハートビート、Cookie へのセッション トークンの保存、イベントなどをサポートするUserApp用のAngularJS モジュールを作成しました。

次のいずれかを実行できます。

  1. モジュールを変更して独自の API にアタッチするか、または
  2. モジュールをUserApp (クラウドベースのユーザー管理 API) と一緒に使用する

https://github.com/userapp-io/userapp-angular

UserApp を使用する場合、(トークンの検証以外に) ユーザー用のサーバー側コードを記述する必要はありません。Codecademyのコースを受講して試してみてください。

これがどのように機能するかの例を次に示します。

  • どのルートをパブリックにするか、どのルートをログイン フォームにするかを指定する方法:

    $routeProvider.when('/login', {templateUrl: 'partials/login.html', public: true, login: true});
    $routeProvider.when('/signup', {templateUrl: 'partials/signup.html', public: true});
    $routeProvider.when('/home', {templateUrl: 'partials/home.html'});
    

    ルートは、.otherwise()ログイン後にユーザーをリダイレクトする場所に設定する必要があります。例:

    $routeProvider.otherwise({redirectTo: '/home'});

  • エラー処理付きのログインフォーム:

    <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>
    
  • エラー処理付きの登録フォーム:

    <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>
    
  • ログアウト リンク:

    <a href="#" ua-logout>Log Out</a>

    (セッションを終了し、ログイン ルートにリダイレクトします)

  • ユーザー プロパティにアクセスします。

    ユーザー プロパティには、userサービスを使用してアクセスします。たとえば、次のようになります。user.current.email

    またはテンプレートで:<span>{{ user.email }}</span>

  • ログイン時にのみ表示される要素を非表示にします。

    <div ng-show="user.authorized">Welcome {{ user.first_name }}!</div>

  • 権限に基づいて要素を表示します。

    <div ua-has-permission="admin">You are an admin</div>

また、バックエンド サービスに対して認証するuser.token()には、セッション トークンを取得して AJAX 要求と共に送信するだけです。バックエンドで、UserApp API (UserApp を使用している場合) を使用して、トークンが有効かどうかを確認します。

ヘルプが必要な場合は、お知らせください。

于 2013-12-17T13:40:49.797 に答える
2

angularjs では、UI 部分、サービス、ディレクティブ、および UI を表す angularjs のすべての部分を作成できます。取り組みやすい技術です。

このテクノロジーを初めて使用し、「ユーザー」を認証したい人として、C#Web APIの力でそれを行うことをお勧めします。そのために、ユーザーを認証するための強力なセキュリティメカニズムを構築するのに役立つ OAuth 仕様を使用できます。OAuth を使用して WebApi をビルドしたら、その API をトークンとして呼び出す必要があります。

var _login = function (loginData) {
 
        var data = "grant_type=password&username=" + loginData.userName + "&password=" + loginData.password;
 
        var deferred = $q.defer();
 
        $http.post(serviceBase + 'token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (response) {
 
            localStorageService.set('authorizationData', { token: response.access_token, userName: loginData.userName });
 
            _authentication.isAuth = true;
            _authentication.userName = loginData.userName;
 
            deferred.resolve(response);
 
        }).error(function (err, status) {
            _logOut();
            deferred.reject(err);
        });
 
        return deferred.promise;
 
    };
 

トークンを取得したら、トークンを使用して angularjs からリソースを要求し、OAuth 仕様を使用して Web Api で安全に保たれたリソースにアクセスします。

詳細については、以下の記事をご覧ください。

http://bitoftech.net/2014/06/09/angularjs-token-authentication-using-asp-net-web-api-2-owin-asp-net-identity/

于 2015-01-25T11:52:52.410 に答える