提醒:本文最后更新于 3323 天前,文中所描述的信息可能已发生改变,请仔细核实。
不得不说,大发的一些想法,还是不错的。
前几天,大发说博客可以用邮箱登录,不过我去测试了,没收到邮件,没试成。好囧。
因为大发没分享方法,我猜大发肯定是init钩子+AJAX请求。至于链接有效性,我就不知道大发是怎么控制了(猜是用transient或session)。
个人觉得免密码更安全一些,特别是在公共场合,毕竟邮箱现在可以扫码登录,也安全。
引自大发的话(我就不罗嗦太多了):这种方式看上去貌似有些违反直觉,但是其实这个比用密码登录更加安全。如果有人猜中或者破解了你的密码,在你更改密码之前他们都可以无限登录。你可能都不知道有人登录了你的帐号。使用邮箱登录:如果有人试图登录你都会接到通知、登录链接15分钟后就会失效、登录链接只可以使用一次。
嗯,我这次写的mail-login.php借鉴了大发的登录版面,但使用传统的form表单,而非大发使用的js。
除了采用传统表单,所有交互界面,一律用wp_die代替。使用到WP Object Cache API使用了Transients API保存一次性链接密匙,有效期10分钟。所有动作全部封装成函数了,可以拆分拿去用。因只是用晚饭时间写的,所以也没怎么测试,有bug可以提。
本产品任意主题可用,只要将以下两文件放在主题目录里面,并且在functions.php加载mail-login-support.php即可。
建议使用include,在funtions.php添加如下:
include(get_template_directory() . '/mail-login-support.php');
mail-login-support.php和mail-login.php文件,详看github项目地址: https://github.com/kn007/wordpress-mail-login-to-dashboard
转载请注明转自: kn007的个人博客 的《通过邮件验证身份登录WordPress》





噗自己的个人博客搞得这么认真严肃干嘛啊哈哈哈
@whuted:
瞎搞
用上了,不过提示邮件发送成功邮箱却收不到。。换个邮箱也没用。
@旧时光: 不会邮件掉垃圾箱了吧
垃圾箱也看了,都没有,弄不明白。。
想换个头像,死活换不了,头疼
@猜猜我是谁: 怎么会。。
這個思路不錯
@CK: 嘿嘿
修复一下网页自适应才是真
@muiteer: 额,怎么了是?
@muiteer: 稀客啊,我晕!
围观
怎么总是认证失败啊?
@hawrry: 我重新用万能的语文。。翻译了下你的回复。。。
邮件不等于邮箱首先,那么假设你说的邮箱地址审核通过,发送来的邮件,链接打开后,并不能成功登录,而是提示认证失败,对吧?
@kn007: 请问怎么解决哈?麻烦了!
@hawrry: 我在后面的评论回复了你,你试下。
邮件审核通过,也正常可以发送,就是审核失败……请问是怎么回事?谢谢!
@hawrry: 邮件审核通过?审核失败?没明白。。。
邮件还要审核?!发送后还要审核?!
或许你说的是邮件要审核(这点没明白,为什么邮件要审核)。。。莫非你说的是我check邮件是否存在的意思?
发送后还要审核,指的是点击链接认证?
@kn007: 不好意思,可能没表达清楚,我在后台使用邮件登录,输入管理员邮箱后提示邮件已发送,而且能正常收到邮件。可是点击邮件里的内容后就提示我认证失败。
@hawrry: 对头……
@hawrry: 如果验证成功,比较大的可能是。。。我的$hash长度太长了,请把mail-login-support.php第46行的(参考github文件)
改为
以相对短的长度作为验证依据,反正自用,也算是安全了
@hawrry: 哦,了解了,你wp本身有用外部对象缓存么?我用的memcache。最简单的,你可以尝试将wp_cache_*换成相应的*_transient,这个是使用sql数据库的。
如果你有研究精神,请在
https://github.com/kn007/wordpress-mail-login-to-dashboard/blob/master/mail-login-support.php
第10行wp_die的第二个参数,加上$email的输出看一下,
或者懒得话,直接把第9行的if ($email != '')删掉,只留login_required($email);,不改第10行
然后再试一次
@kn007: 不好意思,刚刚试了下两种方法,都不成功。第一种方法也改了,第二种也删除掉login_required($email);,还是显示认证失败。
@hawrry: 好的,看我最后一条评论,把所有改动的代码恢复原样,改下$hash,我认为$hash长度太长了,被拒绝了,请把mail-login-support.php第46行的(参考github文件)
改为
以相对短的长度作为验证依据,反正自用,也算是安全了
@hawrry: 最暴力的,把46行的$hash的值改为123先,测试一下先。
@kn007: 应该还是$hash长度的问题,改成8位就可以了
另外还得将wp_cache_*换成相应的*_transient。改动这两处就OK了!太感谢了。
@hawrry: 不谢。我去github写个issue。看来考虑的还是不周到
@kn007: 麻烦了!另外请问一下,如何点击邮件中的链接,认证通过后直接跳转到wp的后台呢?对代码不是太懂
@hawrry: 简单。。第19行
$redirect_to=home_url();
改为
$redirect_to=admin_url();
@hawrry: 谢谢兄弟反馈了。话说不把wp_cache_*换成相应的*_transient,不行么?
@kn007: 不行,仅改hash长度也不成,刚刚改成16也可以认证通过。
@hawrry: 8,16,可以通过是吧?最后一个参数是截取位数长度。
@kn007: 嗯,可以通过。但是前提是必须得把wp_cache改了。我用的是万网的轻云服务器。
@hawrry: wordpress版本是?
@kn007: 最新的4.2.4
@hawrry: 哦,好的,感谢!
话说上面说的直接跳转到wp的后台,没问题了吧
@kn007: 非常感谢,没问题了!现在一切正常。可以把原本登录的密码框框去掉了。
@hawrry: 哈哈,好的。不客气。
@hawrry: 看了下,wp的mysql限定key长度是64。。。。
@kn007: 高手,膜拜!
@hawrry: 谬赞了
@hawrry: 我更新了github
https://github.com/kn007/wordpress-mail-login-to-dashboard
你也可以去看看你的代码有没有改错,特别是*_transient。参数不一样。
或者重新git clone一份试试
@kn007: 一共三处,应该没有错,hash我也是改成8,16了。PS:我对代码不熟悉,纯属业余爱好玩玩,你绝对是个好老师,讲的都到位,连我都能改明白。

@hawrry: 哈哈,好的。transient只有3个参数,而wp object cache有4个参数,主要是怕这个,写错了,可能会导致链接永久有效

看到这个头像,我突然知道你是谁了,哈哈
@hawrry: 话说hawrry没做跳转到youfencun,cdn拒绝了hawrry的访问
博主于2015-08-16 23:07修改了这篇文章。
能否智能通过邮箱验证登录?比如验证码
@Muiteer: 什么意思?