我的应用程序是使用facebook登录的。我能够成功地完成登录,但是当我刷新页面时,session.isAuthenticate就变得没有定义了。
我认为持久化会话的逻辑停留在torii-适配器的获取方法中。下面是我的torii适配器,请告诉我缺少了什么.
import Ember from 'ember';
import {createToken} from 'myapp-new/utils/myapp-utils';
//import User from 'myapp-new/user/model';
export default Ember.Object.extend({
store: Ember.inject.service(),
session: Ember.inject.service('session'),
fetch(){
let token = session.token;
if(Ember.isEmpty(token)){
throw new Error("No session found");
}
else{
return Ember.RSVP.resolve({token});
}
},
open: function(authentication){
let authorizationCode = authentication.authorizationCode;
let token = createToken();
let adapter = this;
return new Ember.RSVP.Promise(function(resolve, reject){
console.log(authentication);
Ember.$.ajax({
url: 'http://myapp.com/getUserInfoWuthAuthCode.php',
//url:'http://localhost:4200',
data: { 'code': authorizationCode,token:token},
success: Ember.run.bind(null, resolve),
error: Ember.run.bind(null, reject)
});
}).then(function(data){
let user = data.user[0];
return {
token:token,
user: user
};
});
}
});下面的更新是我路由的代码
import Ember from 'ember';
export default Ember.Route.extend({
session: Ember.inject.service('session'),
actions:{
signIn(){
console.log("Working");
this.get('session').open('google-oauth2').then(function(){
console.log("Login Worked");
}, function(error){
console.log('error', 'Could not sign you in: '+error.message);
});
}
},
setupController(controller, model){
controller.set('session', this.session);
}
});我不使用任何组件,因此只在路由内挂钩会话。需要注意的一点是,我的torii适配器的fetch方法根本没有被调用(应该在刷新时调用它,不是吗?)
发布于 2017-02-27 09:14:40
应该在配置文件中设置Torii会话变量,如下所示:
// config/environment.js
var ENV = {
torii: {
sessionServiceName: 'session'
}这将将服务变量注入到您的路由中。此外,每次刷新应用程序时,会话都会关闭,为了避免这种情况,请使用路由的beforeModel挂钩,如下所示:
beforeModel: function() {
return this.get('session').fetch().catch(function() {});
},发布于 2017-02-27 05:22:56
let token = session.token;这将始终是未定义的(session对象未定义)。正确的方法是,
let token = this.get('session.token')
// OR
this.get('session')['token']我更喜欢看上去更优雅的第一种选择,至少对我来说是这样。
发布于 2017-02-27 10:22:44
@Falke的回答很有帮助,但并没有解决我的问题。
经过一些研发之后,我发现session.isAuthenticated是以未定义的方式出现的,因为没有调用我的fetch方法。多亏了法尔克,我才能让它运行起来。
我将令牌存储在本地存储中,而不是在适配器的打开方法中使用下面的代码进行会话。
open: function(authentication){
let authorizationCode = authentication.authorizationCode;
//let token = createToken();
// let adapter = this;
return new Ember.RSVP.Promise(function(resolve, reject){
console.log(authentication);
resolve({authorizationCode});
}).then(function(data){
localStorage.setItem('token',authorizationCode);
return {
token:authorizationCode
};
});
}我能够在我的提取方法中找到它,使用下面的代码
fetch(){
let token = localStorage.getItem('token');
console.log(token);
if(Ember.isEmpty(token)){
throw new Error("No session found");
}
else{
return Ember.RSVP.resolve({token});
}希望这能帮上忙
https://stackoverflow.com/questions/42477427
复制相似问题