2013-05-18 116 views
4

我嘗試使用身份驗證開發單頁應用程序。我使用Devise(Rails)和AngularJS。 由於一些不同的原因,我的rails應用程序和我的angularjs應用程序不在同一臺服務器上。所以,我必須處理跨域問題......並且我無法在頭中發送X-CSRF-Token。 我可以正確登錄和註銷併發送GET請求沒有問題。在我的導軌控制器中,我可以使用current_user,它已正確設置。 但是,當我發送POST請求時,current_user爲空。看來我的session_id沒有發送。這個問題是由於跨域,因爲如果我從同一臺服務器發送我的ajax請求,它是好的。設計AJAX - POST請求:current_user爲空

我認爲,我有兩個解決方案: - 不要使用基於身份驗證的cookie,但使用令牌 - 將前端和後端放在同一臺服務器上。

其他想法?爲什麼當我從跨域發送POST請求時,current_user爲空?

回答

4

您可以發送的報頭中的CSRF令牌但它是一個不好的做法,暴露了一些安全漏洞(issue thread on github explaining why)去了解這個

最保險的辦法是禁用CSRF一起:

class ApplicationController < ActionController::Base 
    # or use Api::BaseController < ApplicationController if you are namespacing 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :null_session 
end 

AND使用基於令牌的身份驗證,您可以使用implement yourself或使用設備的:token_authenticatable。您必須配置AngularJS以params或頭文件的形式發送令牌。這裏有一個代碼片段,用於讓rails找出標記是否在頭文件或params中。

class Api::BaseController < ApplicationController 
    prepend_before_filter :get_auth_token 

    private 
    def get_auth_token 
    if auth_token = params[:auth_token].blank? && request.headers["X-AUTH-TOKEN"] 
     params[:auth_token] = auth_token 
    end 
    end 
end 

所以它的工作原理到底是:

  1. 客戶端使用您定義的驗證登錄方法
  2. 從服務器
  3. 獲得認證令牌使用該令牌中的每個後續請求授權
+1

THX的目的,方法是:用authentication_token兼容的oauth2爲SSO認證(如Facebook)?順便說一下,我可以使用oAuth來管理我的令牌嗎? – vpoulain

+1

是的,你可以讓它一起工作。這只是另一種類型的認證,你會連接到你的用戶在這裏是一個不錯的軌道蒙上插曲http://railscasts.com/episodes/235-omniauth-part-1。如果您將自己的應用視爲另一個身份驗證提供商,那麼我相信這是可能的,但不確定這是否會帶來好處。事情是設計已經有一個管理自己的令牌的系統。 –