2014-09-15 2 views
0

Я ранее использовал переменную сеанса, то есть session[:user_id], чтобы отслеживать текущего пользователя, но теперь я пытаюсь подключить свое приложение к EmberJS, требуя использовать сервер Grape API вместо контроллеров и тому подобное. Мне было интересно, как лучше всего отслеживать учетные данные пользователей на разных страницах: Session, Cookie или Thread? На данный момент я склоняюсь к Thread, но мне было интересно, каковы плюсы и минусы каждого из них?Как лучше всего хранить учетные данные пользователя в Rails

+2

Это может зависеть от инфраструктуры вашего api backend, но если вы можете начать просто - почему бы не использовать cookie, как вы делали в прошлом? работает без необходимости «хранить» что-то особенное/браузерные приложения работали таким образом в течение многих лет без особых проблем. –

+0

@ToranBillups это определенно возможность, но разве не будет риска безопасности при обходе частного токена в приложении, управляемом API? – onetwopunch

+0

@onetwopunch, я думаю, не более рискованно, а затем передает cookie для обычного приложения. я говорю, если токен является ключом сортировки, и вы можете его истечь на стороне сервера, должно быть хорошо – charleetm

ответ

0

Аутентификация в API немного отличается. Пользователь должен авторизоваться по каждому запросу, передавая некоторый тип токена, а не один раз за сеанс.

Обычно у вас будет маршрут, который принимает имя пользователя/пароль, который будет возвращать токен аутентификации, а затем токен будет передан как часть BasicAuth или в заголовках для каждого запроса. В Винограде есть несколько способов сделать это. Вы можете добавить помощника Authentication:

module ApiHelpers 
    module Authentication 

    def authenticate! 
     error!('401 Unauthorized', 401) unless current_user 
    end 

    def current_user 
     if token_from_headers 
     @current_user ||= User.find_by api_key: token_from_headers[1] 
     end 
    end 

    def authenticate! 
     error!('401 Unauthorized', 401) unless current_user 
    end 

    def token_from_headers 
     /Token token="(.+)"/.match(headers['Authorization']) 
    end 
    end 
end 

Include, что в главном апи файле:

class API < Grape::API 
    helpers ApiHelpers::Authentication 
end 

Тогда для каждого запроса, который нуждается в аутентификации:

resource :items do 
    get do 
    authenticate! 
    present current_user.items, with: Entities::Item 
    end 
end 

Вы также можете добавить настраиваемое промежуточное программное обеспечение для аутентификации или аутентификации с использованием базового auth. Дополнительная информация по этому поводу в README от Grape: https://github.com/intridea/grape#authentication

Я предполагаю, что ваша конечная точка использует SSL?

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