Typecho(1.2.1)免密登录研究笔记
侧边栏壁纸
  • 累计撰写 199 篇文章
  • 累计收到 1,426 条评论

Typecho(1.2.1)免密登录研究笔记

萧瑟
2025-05-11 / 1 评论 / 22 阅读 / 正在检测是否收录...

最近在研究 Spring Cloud 微服务 框架,便研究了一下它的OAuth2认证模式,想着在Typecho中也对接下,后面就不用再次输入账号密码了,很是方便。

免密登录实现

其中技术难点,是 Typecho 的免密登录方式,看到官方文档说的是封装在了Widget_User组件中,开发人员可调用此组件免密登录。

但是验证了好久,都无法登录成功,又研究了聚合登录的插件中的免密登录(见下方)方法,也不是很好使。

//使用用户uid登录
private function useUidLogin($uid, $expire = 0)
{
    $authCode = function_exists('openssl_random_pseudo_bytes') ?
    bin2hex(openssl_random_pseudo_bytes(16)) : sha1(Typecho_Common::randString(20));
    $user = array('uid'=>$uid,'authCode'=>$authCode);

    Typecho_Cookie::set('__typecho_uid', $uid, $expire);
    Typecho_Cookie::set('__typecho_authCode', Typecho_Common::hash($authCode), $expire);

    //更新最后登录时间以及验证码
    $this->db->query($this->db
        ->update('table.users')
        ->expression('logged', 'activated')
        ->rows(array('authCode' => $authCode))
        ->where('uid = ?', $uid));
}

这个是根据用户的 uid 进行免密登录,但是调用 $this->user->hasLogin() 来判断用户是否登录,一直是 false

查了查资料,看到了一篇《Typecho不改核心代码实现自定义登录、注册功能》文档,然后给了一个思路,研究一下1.2.1版本用户那块的代码;

/var/Widget/User.php中,用户登录跟聚合登录的方式一样,但是就是不好使,再向下有一个方法,叫 simpleLogin; 注解也写的很好“只需要提供uid或者完整user数组即可登录的方法, 多用于插件等特殊场合”,直接调用 $this->user->simpleLogin($uid),即可登录成功。

只要思想不滑坡,方法总比困难多。

评论 (1)

取消
  1. 头像
    acevs
    山东省青岛市城阳区 Windows 10 · Google Chrome

    确实方便一些,认证登陆

    回复