2013-08-17 96 views
18

我在我的angular js應用程序中實現了身份驗證系統。如何在Angular JS應用程序中處理身份驗證

什麼,我打算像下面:

  1. 獲取用戶信息(名稱,並從登錄表單傳遞)
  2. 檢查用戶是否存在
  3. 如果存在服務器響應與會話cookie和前端將重定向到某個頁面。
  4. 然後用戶會做一些任務,這將產生API請求
  5. API請求應該有一個是上步送出3
  6. 服務器檢查Cookie是否發生與否,如果餅乾被發現然後用響應的cookie信息API請求結果。而在我的服務,我做一些像
 
    MyApp.service('myAuth', function($http, $q) { 
     this.authHeader = null; 
     this.checkAuth = function(){ 
     //do api call and if success sets this.authHeader = response 
     } 
     this.isAuthenticaed = function(){ 
      this.authHeader ? return this.authHeder : return false; 
     } 

提交登錄表單我會打電話給checkAuth並從我的服務器,同時做下一個REST調用我如何添加cookie信息讓我的會話cookie回來後還有當用戶在登錄後瀏覽整個應用程序時,我確實想要檢查每次isAuthenticaed是true還是false,在Angularjs中,當它導航到另一個頁面時,它會在從第一次調用設置爲true時重置它嗎?我的方法1-6是否好,或者你有什麼具體的建議? 順便說一句我檢查了以前所以條目,但這些都不是我想知道的。

+0

檢查這個問題[關於AUTH](http://stackoverflow.com/questions/17982868/angularjs-best-practice-for-ensure-user-is-logged -in-or-out-using-cookiestore/17983610#17983610) –

+0

用於檢查用戶是否已通過身份驗證...您的服務器端需要返回並且401請求和重定向至登錄頁面。要檢查這一點,你不能在$ http上放置一個攔截器來監聽這個HTTP 401響應。 –

回答

33

我不知道你的後端,但是這是我會怎麼做

  • 創建一個單獨的登錄頁面(網址專用角不副視點或 模式對話框)。
  • 如果用戶未通過身份驗證重定向到此登錄 頁面。這由服務器重定向完成。此頁面可能使用或不使用 角度框架,因爲它只涉及將用戶\密碼發送到 服務器。
  • 從登錄頁面發出POST(而不是AJAX請求),並在服務器上進行驗證。
  • 在服務器上設置auth cookie。 (不同的框架不同,ASP.Net設置表單身份驗證Cookie)
  • 用戶通過身份驗證後,將用戶重定向到實際的角度應用程序並加載其所有組件。

這節省了在Angular客戶端管理身份驗證所需的任何代碼。如果用戶登錄此頁面,他將通過身份驗證並擁有Cookie。

此外,默認的瀏覽器行爲是發送與每個請求相關聯的域的所有cookie,因此您不必擔心角度是否發送一些cookie。

+2

這是一個非常好的建議,不僅簡化了過程,而且爲獲得更好的表演開闢了新的機會。如果有人對上述回答方法感興趣,請查看這個[ng-conf video](http://youtu.be/62RvRQuMVyg?t=2m41s)關於這個話題。 – Nobita

+1

@Nobita真棒視頻 –

+0

在Angular中,我可能會加載很多視圖而無需刷新頁面。使用Angular,我怎樣才能在無法重新加載頁面的情況下檢查會話? –

6

我使用http-auth-interceptor。 http://ngmodules.org/modules/http-auth-interceptor

在我的後端(asp.net mvc)中,我構建了一個簡單的身份驗證服務,並在用戶未通過身份驗證時返回http錯誤401。 然後我通過SPA網站中的登錄視圖處理錯誤。

+0

我使用攔截器在認證後添加cookie來調用REST請求,有一點我不清楚。如何註銷應該工作。我將會話數據(cookie)保存到文件中,當用戶發送任何新請求時,我會檢查保存的cookie。當用戶發送註銷請求時,我需要刪除cookie嗎? – arnold

+0

我在服務器端使用ASP.NET MVC,並使用修改的表單身份驗證。在註銷時,我的客戶端會向服務器發送註銷請求,服務器會刪除身份驗證cookie。 – S3PP3L

+2

這個模塊是最好的選擇,原始的博客文章解釋瞭如何在你的單頁面應用中擁有/ login或/ logout路徑不再有意義(它在後端)。剛開始使用http-auth-interceptor並且看到它做了什麼/不做什麼 - 所以從整體方法的角度來看,這個答案似乎是最好的,但並不包括登錄流的所有方面(從spa /前端到後端並返回失敗和成功)。 http://frederiknakstad.com/authentication-in-single-page-applications-with-angular-js/提供了很多缺失的細節。 – jimmont

1

(披露:我的UserApp的開發者之一)

你可以使用第三方服務UserApp這一點,與AngularJS module在一起。

檢查出getting started guide,或採取course on Codecademy。下面是它如何工作的一些例子:

  • 登錄形式的錯誤處理:user.current.email

    或者模板:<span>{{ user.email }}</span>

    <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服務訪問

  • 註冊表格錯誤處理:

    <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'});

  • 註銷鏈接:

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

  • 0:只應可見登錄時

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

  • 隱藏元件

爲了驗證您的後端服務,只需使用user.token()獲取會話令牌並通過AJAX請求發送它。在後端,使用UserApp API來檢查令牌是否有效。

如果您需要任何幫助,只是讓我知道:)

4

由以前的答案提出將工作的想法,但我認爲他們是矯枉過正。你不需要任何複雜的東西。

在做下一個REST調用

打開withCredentials默認內$httpProvider像這樣我就可以怎麼加的cookie信息:

app.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.withCredentials = true; 
}]); 

然後刪除通配符(如果你有一個)從CORS相關頭文件,並在服務器端設置allow-credentials。在我的情況下,使用Python +瓶+ 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)] 

現在cookies將被設置,並通過瀏覽器自動,透明地返回。見這些線程的詳細信息:

當用戶將整個日誌後應用導航中我要檢查每一次isAuthenticaed真或假

如上所述,如果auth會話過期或被刪除,請讓服務器返回401,並使用$httpInterceptor在角捕獲這個像這樣:

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); 
}); 
+0

爲什麼我們必須刪除通配符?請解釋。 – user3631341

相關問題