Подтвердить что ты не робот

Devise и OmniAuth помнят OAuth

Итак, я только что установил с помощью Rails 3, Devise и OmniAuth через https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview.

Я успешно аутентифицирую пользователей через Facebook, но они не "запоминаются", несмотря на то, что отмечены:

devise [...]: rememberable, :omniauthable

Я пробовал звонить:

@the_user.remember_me!

... безрезультатно. Нет файлов cookie, которые хранятся/устанавливаются, что означает, что пользователь не сохраняется на всех сеансах.

Кто-нибудь смог получить пользователя из FB, запомнившегося через куки? На мой взгляд, это должно происходить автоматически.

Спасибо за любые идеи или отзывы, которые вы, ребята, могли бы иметь.

4b9b3361

Ответ 1

Я согласен с тем, что вы ожидаете, что Devise установит сеанс до того, как запрос поступит в FB. Я думаю, это недостающая особенность Devise.

У меня возникла проблема, когда я использовал token_authenticatable. Клиент api сразу вызывал следующий URL:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z

Поскольку я использовал token_authenticatable, я предполагал, что это будет подписываться на пользователя. К сожалению, это не работает из коробки. Что вам нужно сделать, чтобы получить эту работу, так это убедиться, что пользователь зарегистрировался до того, как он доберется до этого пути. Вы можете сделать это другими способами, но самый простой способ - дать другой URL-адрес клиенту API (в данном случае "users/connect/facebook". Вот мое дополнение к файлу маршрутов, который заставляет его работать (при условии, что у вас есть модель пользователя с дизайном, и вы не изменили значения по умолчанию):

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

Это позволит убедиться, что сеанс правильно создан, чтобы пользователь узнавал, когда он/она возвращается из facebook.

Ответ 2

Я хотел бы остановиться на правильном ответе @jeroen-van-dijk, вышедшем для меня.

В config/routes.rb добавьте новый маршрут в блок devise_for:

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

end

Затем измените ссылку "login using facebook", чтобы использовать новый маршрут:

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

В приложении/контроллерах/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

Это решение работает хорошо для меня, используя Rails 3.1 и Devise 1.4.9.

Ответ 4

fyi - если вы хотите также использовать функцию extend_remember_period в разработке - вам нужно принудительно выполнить это на объекте пользователя в контроллере обратного вызова

добавлена ​​одна строка в ответ @mustafaturan

user.remember_me = true
user.extend_remember_period = true

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