Ответ 1
ОБНОВЛЕНИЕ: Как @DustMason говорит в своем ответе, просмотрите удивительный embercasts для наилучших методов проверки подлинности.
Чтобы полностью отделить представление (приложение Ember) от сервера (приложение Rails), я хочу использовать аутентификацию по токенам. Я, скорее всего, буду использовать Devise на сервере Rails.
Имеет смысл.
Мне нужно что-то вроде эквивалента before_filter в приложении Ember, где я могу проверить, есть ли текущий пользователь, и если у этого пользователя установлен токен аутентификации.
Вы можете добавить крюк enter
на маршруты, это примерно эквивалентно значению before_filter. Но не уверен, что лучшее место для проверки подлинника-токена.
Сервер Rails возвращает текущий токен аутентификации при каждом вызове.
Имеет смысл. Мы используем cookie-auth и выбираем текущий профиль пользователя, вызывая /api/me
, но оба должны работать.
Если он возвращает нулевой токен аутентификации, приложение Ember должно обнаружить это и перейти в состояние неавторизованного доступа, перенаправляя его в окно входа.
Дело в том, что (в отличие от рельсов) нелегко "защищать" доступ к определенным маршрутам эмбер. И независимо от того, что пользователь всегда может открыть открытую консоль JS и ввести любое состояние, которое они хотят. Поэтому вместо того, чтобы думать: "пользователь может войти в это состояние только в том случае, если он прошел проверку подлинности", подумайте "что, если неавторизованный пользователь каким-то образом перейдет к этому маршруту"
Я подозреваю, что для этого я должен использовать машину состояний Ember, но я не уверен, как действовать дальше. Кто-нибудь еще решил эту проблему?
Наши потребности в авторизации довольно просты, поэтому мы не нашли нужную конечную машину. Вместо этого у нас есть свойство isAuthenticated
на ApplicationController. Мы используем это свойство в application.hbs
, чтобы заменить основное представление формой входа, когда пользователь не аутентифицирован.
{{if isAuthenticated}}
{{render "topnav"}}
{{outlet}}
{{else}}
{{render "login"}}
{{/if}}
Из ApplicationRoute мы получаем профиль пользователя:
App.ApplicationRoute = Ember.Route.extend({
model: function() {
var profiles;
profiles = App.Profile.find({ alias: 'me' });
profiles.on("didLoad", function() {
return profiles.resolve(profiles.get("firstObject"));
});
return profiles;
}
});
Затем наш ApplicationController вычисляет свойство isAuthenticated, основанное на возвращенном профиле.