国外persona用户画像_使用Mozilla Persona验证用户的指南

国外persona用户画像

到目前为止,只有Twitter和Facebook身份验证,我决定将Mozilla Persona添加到我最新项目( 计算机 ,计算机生成的音乐)的列表中。 为什么?

  • 我喜欢尝试新事物
  • 存储密码是一个艰巨的过程,尽管我知道该怎么做,甚至大部分代码都写在另一个项目中,但我认为我不应该为每个需要密码认证的站点做出贡献
  • Mozilla是一个开放的基金会,迄今为止已经产生了许多出色的产品。 Persona实现了BrowserID协议,将来可能会在Firefox以外的其他浏览器中本地支持(目前,您需要包含.js文件)
  • 第三方身份验证已经尝试了很多次,这是一件很了不起的事情,但是由于一些原因,它并不是主流。 有所不同,《女神异闻录》可能会成功地变得更受欢迎。
  • Mozilla的解释很有意义

因此,我从“快速设置”指南开始。 看起来真的很容易。 比OpenID或OAuth身份验证容易得多–您无需在任何地方注册任何内容,不需要第三方库来处理服务器上的验证,并且您无需学习复杂的身份验证流程,因为该流程很简单:

  1. 用户单击登录按钮
  2. 出现一个弹出窗口
  3. 如果未通过Persona认证,则提示用户注册
  4. 如果通过Persona进行了身份验证,则提示用户批准对该站点的身份验证
  5. 弹出窗口关闭,页面重定向/刷新-用户现在已登录

当然,它不是那么简单,但是只有几件事需要注意,本教程中没有提到。 因此,让我们一步一步地遵循官方教程,并在每一点上进行扩展(使用的服务器端语言是Java,但它很简单,您可以使用任何语言来完成)

1.包括.js文件-简单。 建议从Mozilla服务器获取js文件,而不是将其存储在本地,因为它可能会更改(例如,为了修复错误)。 如果将js文件合并到一个文件中(为了加快页面加载速度)可能会比较棘手,但是您的机制可能允许加载远程js文件。

2.登录和退出按钮。 这看起来也很容易。 最好有条件地添加注销处理程序–仅当用户已使用Persona登录时(而不是您的站点支持的其他身份验证方法)

3.侦听身份验证事件。 建议将监听事件放在所有页面上(例如,包含在标题模板中)。 但是这里有一个问题。 如果您的用户已经在Persona中进行了身份验证,但是他的会话在您的站点上已过期,则脚本将自动登录该用户。 这将需要在页面加载后的几秒钟内重新加载页面。 这并不一定是您或用户想要的-例如,在我的情况下,这可能意味着他们刚刚播放的曲目由于页面刷新而中断。 当然可以使用AJAX来完成,但是当UI中的某些内容没有明显原因发生更改时,肯定会造成混乱。 下面,我将显示针对此问题的修复程序。 此外,可能并非到处都需要注销监听器-据我了解,如果您已注销Persona,它将自动注销用户。 这可能不是您想要的-例如,用户可能希望保留一些打开的选项卡,其中包含一些注销后无法访问的文档。

4.验证服务器上的断言。 在这里,您可能需要第3方库来调用验证端点并解析json结果,但是这些是您可能已经包含的非常标准的库。

现在,如何解决自动身份验证的问题? 声明一个新变量userRequestedAuthentication ,该变量保存身份验证是由用户显式发起还是由用户自动发起。 在登录按钮中,单击处理程序,将该变量设置为true 。 这是js代码的样子(顺便说一句,我认为可以将代码放在document.ready()中,而不是直接放在script标记中。假设您以后需要在处理程序方法中使用一些DOM资源,页面已完全加载。另一方面,这可能会减慢该过程的速度)。 请注意,您可以在所有页面上包括一个空的onlogin处理程序,并且仅在身份验证页面上具有完整的处理程序。 但是,鉴于登录按钮位于主页上,或带有javascript模态窗口显示,因此可以在任何地方/在多个页面上都可以使用。

<script type='text/javascript'>var loggedInUser = ${context.user != null ? ''' + context.user.email + ''' : 'null'};var userRequestedAuthentication = false;navigator.id.watch({loggedInUser : loggedInUser,onlogin : function(assertion) {$.ajax({type : 'POST',url : '${root}/persona/auth',data : {assertion : assertion, userRequestedAuthentication : userRequestedAuthentication},success : function(data) {if (data != '') {window.location.href = '${root}' + data;}},error : function(xhr, status, err) {alert('Authentication failure: ' + err);}});},onlogout : function() {window.locaiton.open('${root}/logout');}});
</script>

如您所见,参数被传递到服务器端代码。 那里发生了什么?

@RequestMapping('/persona/auth')
@ResponseBody
public String authenticateWithPersona(@RequestParam String assertion,@RequestParam boolean userRequestedAuthentication, HttpServletRequest request, Model model)throws IOException {if (context.getUser() != null) {return '';}MultiValueMap<String, String> params = new LinkedMultiValueMap<>();params.add('assertion', assertion);params.add('audience', request.getScheme() + '://' + request.getServerName() + ':' + (request.getServerPort() == 80 ? '' : request.getServerPort()));PersonaVerificationResponse response = restTemplate.postForObject('https://verifier.login.persona.org/verify', params, PersonaVerificationResponse.class);if (response.getStatus().equals('okay')) {User user = userService.getUserByEmail(response.getEmail());if (user == null && userRequestedAuthentication) {return '/signup?email=' + response.getEmail();} else if (user != null){if (userRequestedAuthentication || user.isLoginAutomatically()) {context.setUser(user);return '/';} else {return '';}} else {return ''; //in case this is not a user-requested operation, do nothing}} else {logger.warn('Persona authentication failed due to reason: ' + response.getReason());throw new IllegalStateException('Authentication failed');}
}

逻辑看起来比您希望的更复杂,但是让我解释一下:

  • 正如您在javascript代码中看到的那样,空字符串表示“不执行任何操作”。 如果返回任何其他内容,则javascript将打开该页面。 如果不使用spring-mvc,则无需将其从方法中返回@ResponseBody字符串,而是将其写入响应输出流(或用php术语–将其回显)。
  • 首先,您检查系统中是否已经有经过身份验证的用户。 如果有,则什么也不做。 我不确定是否存在Persona在已通过身份验证的用户上调用“ onlogin”的情况,但是如果您使用其他身份验证选项,Persona将不会知道您的用户已使用Twitter登录。
  • 然后,您调用验证URL并将结果解析为JSON。 我已经使用过RestTemplate ,但是任何东西都可以使用RestTemplate ,URLConnection。 对于JSON解析,spring在后台使用了Jackson。 您只需要编写一个值对象,即可保存Persona可能返回的所有属性。 到目前为止,我只包括:状态,电子邮件和原因(杰克逊详细信息:ignoreUnknown = true,spring-mvc详细信息:您需要将FormHttpMessageConverter设置为RestTemplate )。 重要的是,“受众”参数必须是用户当前所在的域。 无论是否使用www,它都会有所不同,因此请对其进行重构,而不是对其进行硬编码或从属性中加载它。 即使您从www重定向到no-www(反之亦然),您仍应为测试而动态获取该URL –测试环境的URL与生产环境的URL不同。
  • 如果Persona身份验证为“可以”,则您尝试在数据库中查找具有该电子邮件的用户。
  • 如果没有这样的用户,并且身份验证操作已手动触发,则将用户发送到注册页面并提供电子邮件作为参数(您也可以在http会话中进行设置,以使用户无法对其进行修改)。 然后,注册页面会询问其他详细信息-名称,用户名,出生日期或您认为合适的任何信息(但请尽量减少-最好仅是全名)。 如果仅需要电子邮件地址,而无需其他任何内容,则可以跳过注册页面并强制注册用户。 注册完成后,您登录用户。 请注意,如果您已将电子邮件存储在会话中(即用户无法从注册页面修改它),则可以跳过确认电子邮件-Persona已确认该电子邮件
  • 如果您的数据库中有该电子邮件的用户,请检查该用户是否已请求该操作,或者是否已(通过注册页面中的复选框)指示他要自动登录。考虑–应该询问用户,还是应该始终将其设置为true或false? 我已经添加了复选框。 如果应该进行登录,则在会话中设置用户并重定向到home(或上一页,或“用户home”的任何页面)(“ context”是会话范围的bean。您可以将其替换为session.setAttribute('user', user) )。 如果身份验证尝试是自动的,但用户不希望这样做,则不执行任何操作。 最后一个“ else”是针对用户在您的站点上没有帐户并且触发了自动身份验证的情况–在这种情况下不执行任何操作,否则最终将无休止地重定向到注册页面
  • 如果身份验证失败,请务必记录原因-然后您可以通过查看日志来检查一切是否正常

使用电子邮件作为唯一标识符( 使数据库列唯一 )的一个很酷的副作用是,如果稍后将Persona添加到您的站点,即使用户以其他方式注册(例如,facebook或常规注册),用户也可以使用它登录。 因此,他们可以将密码设置为长而难以记住的密码,并仅使用Persona继续登录。

我从实现中省略的细节很简单:注册页面只是收集字段并将其提交给/ completeRegistration处理程序,该处理程序将新用户存储在数据库中。 / logout网址仅清除会话(如果存储了cookie,则清除cookie)。 顺便说一句,如果启用了自动登录,并且Persona是您唯一的身份验证方法,则可能不需要存储cookie来保持会话过期后仍保持用户登录状态。

总体而言,即使我提出了要点,实现也仍然很简单。 女神异闻录看起来很棒,我希望很快能在更多站点上看到它。

参考: Bozho的技术博客博客上的JCG合作伙伴 Bozhidar Bozhanov的 Mozilla Persona身份验证用户指南 。

翻译自: https://www.javacodegeeks.com/2012/12/a-guide-to-authenticating-users-with-mozilla-persona.html

国外persona用户画像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天一个linux命令(41):ps命令

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。 要对进程进行监测和控制&#x…

module.js:549 throw err;

解决方法&#xff1a; 1、有可能是拼写错误 2、未明原因。 &#xff08;1&#xff09;删除 node_modules 文件夹 &#xff08;2&#xff09;cnpm cache clean&#xff0c;不过提示错误就用 cnpm cache clean --force &#xff08;3&#xff09;cnpm install 如果还是显示错误就…

matlab zeros初始化为0矩阵

zeros为创建一个值为零的数组&#xff1b; 如matrix1zeros(4,5);%4*5的矩阵&#xff0c;矩阵中每个元素都为0 matrix2zeros(4,5,3);%4*5*3的数组&#xff0c;数组中每个元素都为0 下面举一个将图像存到数组的例子 对RGB图片1.jpg&#xff0c;2.jpg&#xff1b;大小为700*500…

在一个Java版本上运行Eclipse IDE,但在另一个Java版本上运行

Java™开发人员 &#xff08;和其他Java开发人员变体&#xff09;的Eclipse IDE本身就是用于构建Java应用程序的Java应用程序。 这种关系可能会让您的大脑有些奇怪。 Eclipse IDE几乎完全用Java编写&#xff0c;需要Java运行时环境&#xff08;JRE&#xff09;才能运行。 JRE仅…

1.6.4 分离原则: 策略同机制分离,接口同引擎分离

在Unix之失的讨论中&#xff0c;我们谈到过X系统的设计者在设计中的基本抉择是实行“机制&#xff0c;而不是策略”这种做法——使X成为一个通用图形引擎&#xff0c;而将用户界面风格留给工具包或者系统的其它层次来决定。这一点得以证明是正确的&#xff0c;因为策略和机制是…

十、LINQ查询之延迟执行

一、IEnumerable 来实现延迟加载 转载于:https://www.cnblogs.com/fger/p/10644549.html

matlab中“存储空间不足,无法处理此命令”

关于matlab中“存储空间不足&#xff0c;无法处理此命令” 前一段在matlab中绘制三维图片以及处理三维大数据时&#xff0c;电脑上出现了“存储空间不足&#xff0c;无法处理此命令”的提示&#xff0c;我便到网上查找一些相关的解决方案&#xff0c;但是很可惜&#xff0c;在…

inline用法详解

&#xff08;一&#xff09;inline函数&#xff08;摘自C Primer的第三版&#xff09; 在函数声明或定义中函数返回类型前加上关键字inline即把min&#xff08;&#xff09;指定为内联。 inline int min(int first, int secend) {/****/}; inline函数对编译器而言必须是可见的&…

matlab mat文件

如果想在matlab关闭后变量的值依然存在&#xff0c;就需要将变量保存在文件里&#xff0c;这里将变量保存为mat文件。 &#xff08;1&#xff09;将数组保存到mat文件 matrix1magic(4); save(matrix1.mat,matrix1); &#xff08;2&#xff09;需要使用mat文件时&#xff0c…

休眠日志:常见问题的提示和解决方案

如何通过适当的日志记录解决一些最常见的Hibernate问题&#xff1f; Hibernate的日志记录配置是一个重要但很少讨论的主题。 正确的配置可以帮助您在开发过程中发现潜在的问题&#xff0c;而错误的配置则可以在生产中导致严重的性能问题。 这就是我在新书《 Hibernate提示》中…

jdbc工具类2..0

一、创建外部文件 urljdbc:mysql:///qy66 useroot passwordroot drivercom.mysql.jdbc.Driver 二、创建工具类 package cn.zhouzhou;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.Con…

matlab 获取系统时间now,date

&#xff08;1&#xff09; 直接在命令窗输入now&#xff0c;返回数字&#xff0c;这个数字一般无意义&#xff1b;输入date&#xff0c;返回具体日期&#xff1a; >> now ans 7.3699e05 >> date ans 23-Oct-2017 &#xff08;2&#xff09;想要将时间精确…

bash shell脚本访问PostgreSQL的三种方式

bash脚本里有三种方式访问PostgreSQL数据库 但前提是要设置密码文件。当然对于有系统对应账户的数据库角色可以绕过密码登录环节&#xff0c;如 1$ sudo -u postgres psql或 12$ sudo su - postgres$ psql但是对于没有系统账户对应的数据库角色&#xff0c;如要使用脚本登录则…

linux-shell-命令总结

第一种方法执行&#xff1a; 第二种方法执行&#xff1a; 第三种方法执行&#xff1a; 第四种方法&#xff1a;执行 第三种和第四种方法都是在新的进程里执行程序 函数方法 方法就是一个命令&#xff0c;命令写在字符串的第一个位置 type&#xff1a;可以接外部命令&#xff0c…

matlab plot绘制曲线

1)语法 plot(Y) plot(X1,Y1,…) plot(X1,Y1,LineSpec,…) plot(…,’PropertyName’,PropertyValue,…) plot(axes_handle,…) h plot(…) hlines plot(‘v6’,…) 2)说明 plot(Y)如果Y是mn的数组&#xff0c;…

【转】iPython入门技巧

【转】http://www.cnblogs.com/cuiyubo/p/6823478.html 学习《利用python进行数据分析》 第三章 IPython:一种交互式计算和开发环境的笔记&#xff0c;共享给大家&#xff0c;同时为自己作为备忘用。 安装ipython用pip即可。ps.博主用的是win7系统&#xff0c;所以接下来的都是…

进程控制:进程的创建、终止、阻塞、唤醒和切换

进程控制的主要功能是对系统中的所有进程实施有效的管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中&#xff0c;一般把进程控制用的程序段称为原语&#xff0c;原语的特点是执行期间不允许中断&#xff0c;它是一个不可分割的基本单位…

jnlp下载

下载.jnlp文件里的内容需先安装好java Java安装好&#xff0c; java环境变量配置http://jingyan.baidu.com/article/4ae03de320d99f3eff9e6bfd.html 打开cmd&#xff08;WinR&#xff09;如下输入javaws \文件路径\ TCIA_REMBRANDT_06-22-2015.jnlp 后&#xff0c;按回车: 按…

使用Dagger 2在GWT中进行依赖注入

依赖注入是一种软件开发概念&#xff0c;其中为对象提供了创建所需的所有对象或值。 GWT用户已经熟悉GIN&#xff0c;但已不推荐使用此工具&#xff0c;因此不再支持&#xff0c;因此使用GIN的应用程序当前确实需要告别。 Dagger是GWT的新依赖注入框架。 对于那些不熟悉该框架的…

Java Web Token - JWT

JWT认证过程&#xff1a;https://www.codetd.com/article/3602378 JWT官方文档&#xff1a;https://jwt.io/introduction/转载于:https://www.cnblogs.com/leodaxin/p/10648358.html