我目前正致力于将devise作为身份验证后端进行集成,并将angular作为其前端。
我在登录和退出时遇到问题,会话数据会更新,直到页面刷新。
我将做什么来获取没有页面刷新的会话数据..?
感谢您的回答...
AngularJs控制器:
function UsersCtrl($scope, Session) {"use strict";
$scope.CurrentUser = Session.requestCurrentUser();
$scope.login = function(user) {
$scope.authError = null;
Session.login(user.email, user.password)
.then(function(response) {
if (!response) {
$scope.authError = 'Credentials are not valid';
} else {
$scope.authError = 'Success!';
}
}, function(response) {
$scope.authError = 'Server offline, please try later';
});
};
$scope.logout = function() {
// alert("woow");
Session.logout();
};
$scope.register = function(user) {
$scope.authError = null;
console.log(user);
Session.register(user.email, user.password, user.confirm_password)
.then(function(response) {
}, function(response) {
var errors = '';
$.each(response.data.errors, function(index, value) {
errors += index.substr(0,1).toUpperCase()+index.substr(1) + ' ' + value + ''
});
$scope.authError = errors;
});
};
}
AngularJs会话服务:
angular.module('sessionService', ['ngResource'])
.factory('Session', function($location, $http, $q) {
// Redirect to the given url (defaults to '/')
function redirect(url) {
url = url || '/';
$location.path(url);
}
var service = {
login: function(email, password) {
return $http.post('/users/login', {user: {email: email, password: password} })
.then(function(response) {
service.currentUser = response.data.user;
if (service.isAuthenticated()) {
//$location.path(response.data.redirect);
$location.path('/store');
}
});
},
logout: function() {
$http.delete('/sessions').then(function(response) {
$http.defaults.headers.common['X-CSRF-Token'] = response.data.csrfToken;
service.currentUser = null;
redirect('/store');
});
},
register: function(email, password, confirm_password) {
return $http.post('/users', {user: {email: email, password: password, password_confirmation: confirm_password} })
.then(function(response) {
service.currentUser = response.data;
if (service.isAuthenticated()) {
console.log("authenticated");
$location.path('/');
}
});
},
requestCurrentUser: function() {
if (service.isAuthenticated()) {
return $q.when(service.currentUser);
} else {
return $http.get('/users').then(function(response) {
service.currentUser = response.data.user;
return service.currentUser;
});
}
},
currentUser: null,
isAuthenticated: function(){
return !!service.currentUser;
}
};
return service;
console.log(service);
});
答案 0 :(得分:0)
关于构建这样的应用程序(restful)的一件事就是将后端理解为api和应用程序作为前端非常好。
然后考虑一个故事;
在您应用的登录屏幕中
前端:您向后端提供了凭据;
后端:检查并验证然后它将创建一个存储在db中的唯一哈希(建议JWT检查前端到期时间)到您的前端。
前端:将其保存在cookie中。 也可以将它放在你的ajax设置标题部分中作为"授权:{token}"
前端:然后将带有此标题的每个请求发送到您的后端。
后端:始终检查令牌是否存在且有效以提供资源。
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/此链接帮助我了解过去的所有事情和误解。
答案 1 :(得分:0)
使用$ window.location.reload();在页面重定向之前。
答案 2 :(得分:0)
实现此目的的一种方法可能是覆盖设计sessions_controller销毁操作,然后执行sign_out @current_user
将会话作为json返回