2010-12-17 2 views
18

그래서, 레일즈 3, Devise, OmniAuth를 사용하여 https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview을 통해 설치를했습니다.OAuth를 기억하고있는 Devise와 OmniAuth

나는 성공적으로 페이스 북을 통해 사용자를 인증하고있어,하지만 그들은 표시에도 불구하고 "rememberable"아니다 :

devise [...]: rememberable, :omniauthable 

내가 전화하려고 :

@the_user.remember_me! 

을 ... 아무 소용. 저장/설정중인 쿠키가 없습니다. 이는 사용자가 여러 세션에서 지속되지 않음을 의미합니다.

아무도 쿠키를 통해 기억 된 FB에서 유래 한 사용자를 얻을 수 있습니까? 내 생각에, 이것은 자동으로 일어나야합니다.

의견이나 의견을 보내 주셔서 감사합니다.

답변

11

요청이 FB로 보내지기 전에 Devise가 세션을 설정한다고 생각합니다. 나는 Devise의 누락 된 기능이라고 생각합니다.

나는 token_authenticatable을 사용하는 곳에서 문제가 발생했습니다. API를 클라이언트가 직접 다음 URL을 호출했다 :

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z 

것은 내가 사용자가 로그인 할이 가정되었다 token_authenticatable 사용 된 이후. 불행히도이 기능은 기본적으로 작동하지 않습니다. 이 기능을 사용하려면 사용자가이 경로에 도달하기 전에 로그인해야합니다. 다른 방법으로도 할 수 있지만 가장 쉬운 방법은 API 클라이언트 (이 경우 "users/connect/facebook")에 다른 URL을 제공하는 것입니다. 경로 파일에 내 추가 사항이 있습니다. 당신이 기본값을 변경하지 않았고 유증을 가진 사용자 모델) : 그/그녀가 페이스 북에서 반환 할 때 사용자가 인식 될 수 있도록

authenticate :user do 
    get 'users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}") 
end 

이 확인 세션이 제대로 생성을 다할 것 나 '

+0

API 클라이언트에게 다른 URL을 "주는"방법은 무엇입니까? config/initializers/devise.rb의 어딘가에 있습니까? –

19

. [email protected] (정답)에 대해 자세히 설명하고 싶습니다.

config/routes.rb에서 devise_for에 새 경로를 추가하십시오. 블록 :/컨트롤러/user_omnniauth_callbacks_controller.rb

class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController 
    include Devise::Controllers::Rememberable 

    def facebook 
    @user = User.find(...) 
    ... 
    remember_me(@user) # set the remember_me cookie 
    end 
end 

이 솔루션은 잘 작동 응용 프로그램에서

<!-- before it linked to user_omniauth_authorize_path --> 
<%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %> 

:

devise_for :users, :controllers => { 
        :omniauth_callbacks => "user_omniauth_callbacks" } do 
    ... 
    get '/users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}"), 
           :as => 'user_oauth_connect' 

end 

그런 다음 새로운 경로를 사용하도록 "로그인 페이스 북을 사용하여"링크를 변경 나에게 레일즈 3.1과 디비즈 1.4.9를 사용했다.

+0

처음에는 모델이 아닌 컨트롤러에서 remember_me에 대한 호출을 놓쳤습니다. 마지막으로 올바른 모듈을 포함시킨 후 작동하게했습니다. –

+0

Rails 3.2.3 및 Devise 2.1.2에서 "include"줄과 "remember_me()"호출을 추가하는 것으로 충분했습니다. 라우팅을 변경할 필요가 없었습니다. –

+0

@haraldmartin 나는 모든 해결책을 시도했지만, 그들은 나를 위해 일하지 않고 다음 포스트에서 새로운 질문을하고있다. 저 좀 도와 주 시겠어요? 감사합니다 Fabrizio http://stackoverflow.com/questions/42280622/devise-omniauth-facebook-rememberable –

0

참고하시기 바랍니다 - 당신은 또한 유증에 extend_remember_period 기능을 사용하려면 - 당신은에이를 강제 할 필요가

콜백 컨트롤러의 사용자 개체는 @ mustafaturan의 대답에 한 줄을 추가

user.remember_me = true 
user.extend_remember_period = true 

# then add your signing in code 
sign_in(:user, user)