更新: @DustMason が回答で述べているように、認証のベスト プラクティスについては素晴らしいembercastsを確認してください。
ビュー (Ember アプリ) をサーバー (Rails アプリ) から完全に分離するために、トークン認証を使用したいと考えています。RailsサーバーでDeviseを使用する可能性があります。
理にかなっています。
現在のユーザーが存在するかどうか、およびそのユーザーに認証トークンが設定されているかどうかを確認できる、Ember アプリに相当する before_filter のようなものが必要です。
ルートにフックを追加できenter
ます。これは before_filter とほぼ同じです。しかし、認証トークンを確認するのに最適な場所かどうかはわかりません。
Rails サーバーは、すべての呼び出しで現在の認証トークンを返します。
理にかなっています。cookie-auth を使用し、呼び出して現在のユーザー プロファイルをフェッチします/api/me
が、どちらも機能するはずです。
null 認証トークンが返された場合、Ember アプリはこれを検出し、認証されていない状態に移行して、ログイン ビューにリダイレクトする必要があります。
このアプローチの問題点は、(レールとは異なり) 特定の 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 プロパティを計算します。