我正在使用facebook登录我的应用程序。我能够成功完成登录,但是当我刷新页面session.isAuthenticate
变得未定义时。
我认为持久化会话的逻辑保留在torii-adapter的fetch方法中。下面是我的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-adapter的fetch方法根本没有调用(它应该在刷新时调用,不是吗?)
答案 0 :(得分:1)
应该在配置文件中设置Torii会话变量,如下所示:
// config/environment.js
var ENV = {
torii: {
sessionServiceName: 'session'
}
这会将服务变量注入到您的路由中。此外,每次刷新应用程序时,会话都会关闭,以避免使用路由的beforeModel挂钩,如下所示:
beforeModel: function() {
return this.get('session').fetch().catch(function() {});
},
答案 1 :(得分:0)
let token = session.token;
这将始终未定义(session
对象未定义)。正确的方法是,
let token = this.get('session.token')
// OR
this.get('session')['token']
我更喜欢看起来更优雅的第一个选项,至少对我而言。
答案 2 :(得分:0)
@ Falke的答案很有帮助,但没有解决我的问题。
经过一段时间后,我发现session.isAuthenticated未定义,因为我的fetch方法没有被调用。感谢@falke我能够让它运行。
我在我的适配器的open方法中使用下面的代码将我的令牌存储在localstorage而不是session中
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});
}
希望这会有所帮助