2013-03-08 1 views
4

Я использую Rails 3, и я успешно создал веб-api. Для кучи контроллеров требуется логин, поэтому я решил использовать Devise и token_authenticable. Это работает, но не так, как я ожидал: хотя я должен был предоставить токен входа для каждого запроса, вместо этого он выглядит так, как будто он нужен только один раз, а затем система создает cookie в ответе точно так же, как обычный сеанс браузера. Я хочу достичь чего-то вроде facebook graph api, где каждый запрос должен был предоставить токен сеанса для работы.Devise token_authenticatable без cookies сеанса

Есть ли какой-либо флаг, который я могу настроить, чтобы дать команду Devise не отправлять файлы cookie сессии, если я использую веб-api и отправлять файлы cookie сеанса, если я пользуюсь браузером?

+0

Если он отправляет файл cookie сессии, и вы игнорируете его --- есть ли какой-либо вред? –

+0

Это тоже хорошо. На самом деле так оно и работает. Это определенно не вопрос жизни или смерти ... Мне просто любопытно – user1170896

+0

Если вы храните свой сеанс в базе данных (или memcache или что-то еще), каждый раз, когда вы подписываете пользователя, вы добавляете строку в свою базу. Таким образом, это может быть проблемой, если вы используете API. Таким образом, было бы неудобно, если вы сможете войти в систему, но не сохранять сеанс. – joel1di1

ответ

1

У меня была та же проблема.

Был линия в Sessions контроллер моего API:

warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure") 

Это был вход пользователя в систему и создания сеанса (который я не заметил в первый)

Решение заключается в использовании что-то похожее на это (нашел в blogpost):

@user=User.find_by_email(email.downcase) 
if @user.nil? 
    render :status=>401, :json=>{:message=>"Invalid email or password."} 
    return 
end 

# http://rdoc.info/github/plataformatec/devise/master/Devise/Models/TokenAuthenticatable 
@user.ensure_authentication_token! 

if not @user.valid_password?(password) 
    logger.info("User #{email} failed signin, password \"#{password}\" is invalid") 
    render :status=>401, :json=>{:message=>"Invalid email or password."} 
else 
    render :status=>200, :json=>{:token=>@user.authentication_token} 
end 

в основном не вход пользователя в, но получение маркера. Остальные части приложения, кроме выхода из системы, работали нормально.

0

Я использовал protect_from_forgery with: :null_session, так что сессия игнорируется.

Смежные вопросы