2013-05-18 2 views
4

인증이있는 단일 페이지 응용 프로그램을 개발하려고합니다. 저는 Devise (Rails)와 AngularJS를 사용합니다. 레일 응용 프로그램과 내 angularjs 응용 프로그램이 동일한 서버에 있지 않은 몇 가지 이유가 있습니다. 따라서 크로스 도메인 문제를 처리해야합니다 ... 그리고 헤더에 X-CSRF-Token을 보낼 수 없습니다. 제대로 로그인하고 로그 아웃하고 문제없이 GET 요청을 보낼 수 있습니다. 내 레일 컨트롤러에서 current_user를 사용할 수 있습니다. 올바르게 설정되었습니다. 그러나 POST 요청을 보낼 때 current_user는 null입니다. 내 session_id가 전송되지 않은 것 같습니다. 동일한 서버에서 내 Ajax 요청을 보내면 문제가되지 않기 때문에 문제는 크로스 도메인 때문입니다.Devise AJAX - POST 요청 : current_user is null

나는 2 가지 해결책이 있다고 생각한다. - 인증 쿠키 기반을 사용하지 않지만 토큰을 사용한다. - 프런트 엔드와 백엔드를 동일한 서버에 배치한다.

다른 아이디어? 왜 크로스 도메인에서 POST 요청을 보낼 때 current_user가 null입니까? 이 모두 함께 CSRF을 해제 (issue thread on github explaining why)이 대략가는

가장 안전한 방법은 몇 가지 보안 구멍을 노출하는 나쁜 습관이다 그러나이

답변

4

당신은 헤더의 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 

사용 토큰 기반 인증이 다음 중 하나를 수행 할 수 있습니다 implement yourself 또는 사용 고안의 : token_authenticatable. params 또는 헤더에서 토큰을 보내도록 AngularJS를 구성해야합니다. 토큰이 헤더 또는 매개 변수에있는 경우 레일을 계산하는 데 사용하는 스 니펫입니다.

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. 에서
  4. 얻 인증 토큰이 각 후속 요청 토큰을 사용 인증
+1

들으하기위한 목적으로,인가 : SSO 인증을위한 OAuth2를 가진 authentication_token 호환 (페이스 북과 같은)? 그런데 oAuth를 사용하여 토큰을 관리 할 수 ​​있습니까? – vpoulain

+1

예. 함께 사용할 수 있습니다. 그것은 좋은 레일 에피소드 http://railscasts.com/episodes/235-omniauth-part-1 캐스트의 여기에 사용자에 부착 할 인증의 또 다른 유형입니다. 다른 인증 공급자로 자신의 응용 프로그램을 처리한다면 나는 그것이 전혀 도움이 될 것입니다 경우 확실히 가능하지만 믿습니다. 문제는 이미 자체 토큰을 관리하기위한 시스템을 갖추고 있다는 것입니다. –