用户配置文件信息在每次页面刷新后重置(使用Hello.js)
User profile info getting reset after each page refresh (using Hello.js)
我在AngularJS应用程序中使用Hello.js,让用户通过Facebook进行身份验证。一旦用户登录,我从Facebook获得用户信息,我就会使用json,从我自己的数据库中获得用户对象,并将其存储在根范围中,这样我的网站中的各个区域就可以访问用户的配置文件信息(例如,在我显示登录用户名称的标题中)。
这是处理身份验证的服务
angular.module('myApp')
.factory('userService', function($rootScope, $location) {
// Hello.js Functions
hello.init({
facebook : '1234567891234545'
});
var service = {
isLoggedIn: function() {
return $rootScope.loggedInUser != null;
},
login: function() {
hello('facebook').login( function() {
hello('facebook').api('/me').success(function(json) {
$rootScope.loggedInUser = getUserFromMyOwnAPI(json.id);
$rootScope.$apply(function() {
$location.path('/');
});
});
});
},
logout: function() {
hello('facebook').logout( function() {
$rootScope.loggedInUser = null;
$location.path('/');
});
},
loggedInUser: function(){
return $rootScope.loggedInUser;
}
}
return service;
})
我遇到的问题是,每次刷新页面时,我都会丢失个人资料信息。这很有道理,因为存储用户数据的$rootScope.loggedInUser(基于我从Facebook上得到的json)将在页面刷新后重置。
我该如何处理?我应该把用户数据放在localStorage而不是rootScope中吗?或者,每次我想引用用户的配置文件信息时,我应该以某种方式利用hello("facebook").api("/me")吗?
我注意到hello.js已经在localStorage中存储了一些东西:
key: hello
{"facebook":{"state":"","access_token":"blahblahblah","expires_in":6776,"https":"1","client_id":"12345","network":"facebook","display":"none","redirect_uri":"http://adodson.com/hello.js/redirect.html","scope":"basic","expires":1412632794.806}}
所以我想知道我是否会通过将用户对象添加到localStorage来重复这项工作。
这个问题的答案是主观的,可以用不同的方式争论。然而,根据您的问题和评论,我认为在本地存储中保留(非敏感)用户配置文件信息是提供不间断用户体验的好选择。
永远不要将用户信息存储在localStorage、cookie和/或其他不安全机制中,包括但不限于社交网络信息。即使您需要在不那么关键的信息上做出妥协,也可以使用内存(比如范围变量)。您还必须考虑在localStorage中存储用户信息时产生的复杂性,例如当用户注销社交网络时。现在,会话跟踪和WWW本身一样古老。如何跟踪会话?有无数的文章讨论了Cookie、Json Web令牌、服务器端会话状态等的利弊。我个人的观点是将大部分用户信息存储在服务器端,并使用存储在任何可能的介质(如Cookie、Query Param、localStorage)中的会话ID将当前用户链接到该会话。只有当您有后端并且OAuth为您提供令牌时,这才有用。我在hello.js中看不到它为你提供了令牌。因此,考虑到你不应该在浏览器中存储任何客户端用户信息,而且hello.js也不会为你提供在后续调用中重复使用的令牌,我给你的建议是每次都登录用户。
关于您的代码:
正如Adin和DanArl已经指出的,您可以通过多种不同的方式来实现用户的会话跟踪过程——最好是服务器端,通过存储在会话cookie中的某种标识符来识别。
关于您的实际代码,您可以查看jshint:三个警告
10 Use '!==' to compare with 'null'.
31 Missing semicolon.
34 Missing semicolon.
Three undefined variables
1 angular
4 hello
13 hello
14 hello
23 hello
15 getUserFromMyOwnAPI
您应该通过将"hello"传递给您的"userService"来正确地注入"hello"。(请看:https://docs.angularjs.org/guide/di如果您想在AngularJS)中获得有关依赖项注入的更多信息
关于您的实际问题:
在您从您喜欢的存储方式收到代币后,您应该能够通过以下方式检查和验证代币:
GET graph.facebook.com/debug_token?
input_token={token-to-inspect}
&access_token={app-token-or-admin-token}
来源:https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.1#checktoken
然后,您可以尝试将这些信息传递给helljs(我已经习惯了这个库)
- 在指令控制器中使用$attrs时出现问题
- 如何使用jQuery自动打开页面上的所有链接
- 如何使用url加载程序在webpack中导入多个图像
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何使用jquery在填充自动完成的值后使文本框只读
- 使用agility.js进行页面布局和合成
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 如何使用WCF服务和javascript表单post上传.doc文件
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使用动画实现纸张推车
- 使用hello.js自定义OAuth2提供程序
- 使用hello js获取雅虎朋友列表
- 使用hello.js在Facebook墙上发帖失败
- Twitter授权使用Hello.js库,但无法接收电子邮件
- 使用hello.js安全登录
- 用户配置文件信息在每次页面刷新后重置(使用Hello.js)
- Hello World'使用Firefox扩展
- 使用angularjs创建一个简单的hello world应用程序