我有一个有效的 oauth2 身份验证过程,我使用 ember 简单身份验证获取访问令牌(例如来自 facebook),将其发送到调用 fb.me() 的后端,然后使用 JWT 创建令牌。然后将此令牌发送回 ember 应用程序,该应用程序必须将其与每个服务器请求一起发送,包括 ember-data 发出的那些请求。
在浏览器重新加载后,我还需要让这个令牌可用。
我尝试了很多选项,我在会话上设置了一个属性“authToken”——我相信这使用本地存储来持久化经过身份验证的会话。
但我似乎总是无法协调该令牌的检索——要么我无权访问会话,要么令牌不再在会话中,要么我无法更改 ember 数据标头。
有没有人有一个简单的例子来说明如何做到这一点 - 我认为这应该很容易,但我显然错过了一些东西!
谢谢。
更新
我唯一能够开始工作的是使用 torii,如下所示,但会话内容在刷新时仍然丢失 - 我可以看到它仍然经过身份验证,但它丢失了我在这里设置的令牌。所以我仍在寻找真正的解决方案。
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') 会未定义,我认为默认情况下会话保留在本地存储中。它经过身份验证的事实是持久的,但是如果没有令牌,那将毫无用处,因为服务器将拒绝对受保护端点的调用。