私は、ember simple authを使用して(Facebookなどから)アクセストークンを取得し、それをバックエンドに送信してfb.me()を呼び出し、JWTを使用してトークンを作成するoauth2認証プロセスを実行しています。このトークンはその後、ember アプリに送り返されます。このトークンは、ember-data によって行われた要求を含むすべてのサーバー要求と共に送信する必要があります。
また、ブラウザのリロード後にこのトークンを使用できるようにする必要があります。
セッションにプロパティ「authToken」を設定する多くのオプションを試しました-これはローカルストレージを使用して認証されたセッションを永続化すると思います。
しかし、私は常にこのトークンの取得を調整するのに問題があるようです.セッションにアクセスできないか、トークンがセッション上にないか、emberデータヘッダーを変更できません.
これを行う方法の簡単な例を誰かが持っていますか?簡単だと思いますが、明らかに何かが欠けています!
ありがとう。
アップデート
私ができる唯一のことは、以下に示すように鳥居を使用することですが、セッションの内容は更新時にまだ失われています.認証されていることはわかりますが、ここで設定したトークンが失われています. だから私はまだ本当の解決策を探しています。
authenticateWithGooglePlus: function () {
var self = this;
this.get('session').authenticate('simple-auth-authenticator:torii', 'google-oauth2')
.then(function () {
resolveCodeToToken(self.get('session'), self);
});
}
resolveCodeToToken は、サーバーからベアラー トークンを取得し、それをセッションに設定してから、保護されたページに遷移します。
function resolveCodeToToken(session, route) {
var authCode = session.content.authorizationCode;
var type = session.content.provider.split('-')[0];
$.ajax({
url: 'http://localhost:4200/api/1/user/auth/' + type,
data: {authCode: authCode}
}).done(function (response) {
// todo handle invalid cases - where user is denied access eg user is disabled
session.set('authToken', response.token);
route.transitionTo('activity', moment().format('DDMMYYYY'));
});
}
そして、すべてのリクエストに (セッションに保存された) トークンを配置するためのカスタムオーソライザーがあります。
import Base from 'simple-auth/authorizers/base';
export default Base.extend({
authorize: function(jqXHR, requestOptions) {
var accessToken = this.get('session.content.authToken');
if (this.get('session.isAuthenticated') && !Ember.isEmpty(accessToken)) {
jqXHR.setRequestHeader('Authorization', accessToken);
}
}
});
更新後に this.get('session.content.authToken') が未定義になる理由がわかりません。デフォルトでは、セッションはローカルストレージに永続化されていると思いました。認証されているという事実は永続化されますが、サーバーは保護されたエンドポイントへの呼び出しを拒否するため、トークンがないと役に立ちません。