Node.js 中的 WordPress 身份验证

2024-01-31

允许用户使用 WordPress 页面中的用户帐户使用 Node.js 应用程序的最佳方式是什么?

我尝试过在 Redis 中存储会话信息,但我对 PHP 不太熟悉,并且遇到了不存储会话的死胡同。我用过这个guide http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/.

我也尝试过使用节点 phpass https://github.com/jhurliman/node-phpass但它没有很好的记录。我已成功连接到 Wordpress 数据库,但使用 node-phpass 生成的密码哈希值与 wp_users 表中的哈希值不匹配。

这是我用来测试 node-phpass 的:

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'wordpress',
  password : 'jPWrwvGbYXMADd8F',
  database : 'wordpress',
});

connection.query('SELECT * FROM wp_users', function(err, rows) {
    if (err) { 
        console.log("Database error: " + err);
    } else {
         for (var i = 0; i < rows.length; i++){
            console.log("Rows[" + i + "] : " + rows[i].user_login + " " + passwordHash.checkPassword('secret',rows[i].user_pass));
         }
    }
});

除了共享会话之外,还有其他更好的方法吗? OAuth?


我不太明白您是否希望用户主要在您的 node.js 应用程序上进行身份验证,然后为 WordPress 创建 cookie,或者相反,但是一旦您了解 WordPress 是如何做到这一点的,您将能够完成这两个任务。

首先,WordPress 使用大量哈希值和盐来保护其 cookie,因此您需要知道这些哈希值和盐在哪里,以便能够为 Nodejs 应用程序上的值定义相同的值。

On wp-config.php你会找到我们正在寻找的哈希值和盐的常量,我认为你只需要将常量值传输到你的nodejs应用程序LOGGED_IN_KEY, LOGGED_IN_SALT, NONCE_KEY and NONCE_SALT。您可以更好地查看该文件wp-includes/default-constants.phpWordPress 保留其默认常量值,请注意 if(define(..)),因为如果该常量是在该文件之前的其他地方定义的(可能在wp-config.php)该值将来自该值,而不是来自wp-includes/default-constants.php file.

现在,您需要了解 WordPress 如何创建 cookie。 这是登录 cookie 的示例:

Cookie Name: wordpress_logged_in_2801795354f6f1c2d2ab3b48033a8257
Cookie Value: admin|1392386298|647852d61caf4cfdea975d54ecb09ca8
Cookie Value: %user_login%|%cookie_expire_time%|%hashed_sliced_user_hashed_password%

你需要让你的nodejs应用程序理解这个cookie,能够像WordPress一样破坏它。

在 WordPress 上创建身份验证 cookie 的函数位于wp-includes/pluggable.php

$logged_in_cookie = wp_generate_auth_cookie($user_id, $expiration, 'logged_in');
//...
setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);

注意常数LOGGED_IN_COOKIE默认设置为wp-includes/default-constants.php,在同一个文件中,您有COOKIEHASH常量,您需要将其值传输到您的nodejs应用程序,以便能够读取和验证cookie名称,COOKIEHASH只是使用 md5 散列的网站 URL。

if ( !defined( 'COOKIEHASH' ) ) {
    $siteurl = get_site_option( 'siteurl' );
    if ( $siteurl )
        define( 'COOKIEHASH', md5( $siteurl ) );
    else
        define( 'COOKIEHASH', '' );
}
//...
define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH);

如果你不想传输所有这些,你可以在 wp-config.php 上设置LOGGED_IN_COOKIE常量包含您想要用于 WordPress 的登录 cookie 名称,并将此常量添加到您的 Nodejs 中,如下所示:

//WordPress wp-config.php
define('LOGGED_IN_COOKIE', 'logged_in_'.'%privateHashKey%');
//NODEJS
var LOGGED_IN_COOKIE = 'logged_in_'+'%privateHashKey%';

最后你需要描绘出功能wp_generate_auth_cookie, wp_hash和 hash_hmacto your nodejs application if you want to create the cookie there, the first two functions reside on the filewp-includes/pluggable.phpthe哈希_hmacresides onwp-includes/compat.php`。

if ( !function_exists('wp_generate_auth_cookie') ) :
//...
function wp_generate_auth_cookie($user_id, $expiration, $scheme = 'auth') {
    $user = get_userdata($user_id);

    $pass_frag = substr($user->user_pass, 8, 4);

    $key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme);
    $hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key);

    $cookie = $user->user_login . '|' . $expiration . '|' . $hash;

    return apply_filters('auth_cookie', $cookie, $user_id, $expiration, $scheme);
}
endif;

一旦你明白了什么wp_generate_auth_cookie函数正在执行,您还可以解码 cookie 并在您的 Nodejs 应用程序上对 WordPress 用户进行身份验证。

请注意,WordPress 对登录的 cookie 值所做的只是在数据库中分割用户的散列密码,与用户登录名和 cookie 的过期时间(unix 时间)合并,然后将所有内容散列在一起。然后,他使用用户登录名、cookie 的过期时间和他刚刚创建的哈希值创建 cookie 值,通过前两个值,他可以使用用户的哈希密码验证“令牌哈希值”。

您可能想知道,要在 WordPress 上注销用户,您需要在注销 url 上传递用户的随机数密钥,因此,如果您想通过 Nodejs 应用程序从 WordPress 注销用户,您可能需要传输随机数密钥功能。

如果您的应用程序位于子域中,您可能需要声明wp-config.php,否则 WordPress 将仅使用 cookie 上的完整域,并且 cookie 将不可用于子域。

define('COOKIE_DOMAIN', '.domain.com');

希望这能给您更好的指导。祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中的 WordPress 身份验证 的相关文章

  • 尝试使用 php 发送 POST 请求,无论我做什么,我都会收到“HTTP ERROR 500”

    为了发出 HTTP 请求 有人建议我尝试使用 PHP 并给了我一段代码 url https example com dashboard api data array to gt PHONE NUMBER from gt SENDER ID
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • PHP 无法加载动态库“php_pdo_oci.dll”

    我在 Windows 8 上运行 Apache 2 4 7 和 PHP 5 5 9 我安装了 PHPUnit 并开始弹出此警告图像 警告 是的 我在 php ini 中启用了扩展加载以及 extension dir 以更正文件夹 并且该文件
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • 如何防止在 PHP 中使用超出“使用”范围的特征方法

    我想知道是否有任何方法可以防止在 PHP 的任何类上下文之外使用特征方法 让我用一个简短的例子来解释我想要什么 这是我当前的代码 File MyFunctions php trait MyFunctions function hello w
  • 在heroku上部署时出错,/bin/sh: 1: webpack: not found

    这是我在 heroku 网站上手动部署时遇到的错误 首先 我在 json 文件中遇到错误 因此我指定了正在运行的 npm yarn 和 node 版本 这些错误似乎已经清除 现在我就是这样的人 并且已经搜索了谷歌 但似乎找不到太多关于修复它
  • 通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

    今年夏天我安装了两个不同的 PHP 系统 每个都使用两种不同的方法 方法 1 每个任务一个 PHP 文件 该方法需要一个PHP为每个主要任务创建文件 例如 我的上传脚本可以通过http www domain com upload php O
  • 在node.js中加载并执行外部文件

    从另一个节点js文件运行一个节点js文件是否容易 可能 例如 我有两个文件 test1 js 和 test2 js 我想从 test2 js 执行 test1 js 文件 我认为完成你想做的事情的更好方法是按照我的其他答案建议的去做 但是要
  • 访问sendBeacon发送的数据

    文档表明sendBeacon通过发送其数据HTTP POST request 但在 PHP 中 POST变量似乎是一个空数组 这是我的 JavaScript 代码 navigator sendBeacon beacon log php My
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • 使用 Sequelize 实现单表继承

    有没有办法使用sequelize来创建单表继承 我希望有一个用于购买和 PartialPurchase 模型的 STI 其中我将有一个类型字段 该字段为 Purchase 或 PartialPurchase 以及类 Purchasing 和
  • 如何纠正这个非法字符串偏移?

    我收到此错误 警告 第 32 行 home mysite public html wp content themes evento lib php extra class php 中的非法字符串偏移 type 我意识到文件中的这部分代码是错
  • Plesk Windows 部署 Node.js

    我创建了一个以 Node js 作为后端的 Angular 项目 这是服务器文件结构 Home directory httpdocs node hm dist browser folder server folder server js p
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 流星内存不足

    我正在使用流星来制作报废引擎 我必须执行一个 HTTP GET 请求 这会向我发送一个 xml 但这个 xml 大于 400 ko 我得到一个异常 内存不足 result Meteor http get http SomeUrl com 致
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 从字符串中获取数字

    我有一个字符串 例如 lorem 110 ipusm 我想获取 110 我已经尝试过这个 preg match all 0 9 string ret 但这正在返回 Array 0 gt 1 1 gt 1 2 gt 0 我想要这样的东西 Ar
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据

随机推荐

  • 登录 Twitter 后如何获取 oauth 令牌?

    登录 Twitter 后 我可以打印一些有用的数据 例如用户名和用户 ID 但是 OAuth 令牌始终为空 我怎样才能得到它 我需要将 OAuth 令牌发送到我的服务器 以便它可以验证用户确实是他所说的人 ACAccountStore ac
  • 使用 jQuery 淡入淡出背景图像?

    到目前为止 我已经尝试了很多方法 但没有成功 有任何想法吗 您可以淡化背景颜色 但不能淡化背景图像 解决这个问题的方法是将你的图像设置为 img 标签并默认隐藏它们display none 给出你的图像position absolute a
  • Outlook 邮件项目作为流

    是否可以退货MailItem直接作为Stream MailItem from Microsoft Office Interop Outlook 现在我找到了一个临时解决方案 首先保存一个MailItem到一个目录 打开它并将流返回到文件 然
  • 在 matlab 中,如何放大脚本中的绘图

    我想使用脚本放大情节 我只对水平约束缩放感兴趣 所以我想做一些类似的事情 p plot myData z zoom set z ZoomInToPoints 50 100 or p plot myData myZoom 50 100 因此
  • Qt:设置QMainWindow的大小

    我是Qt新手 所以我想知道是否有办法设置a的大小QMainWindow 例如 用户桌面的 70 我尝试了拉伸因子 但没有用 QWidget setFixedSize我认为有效 但仅限于像素数 在 QMainWindow 构造函数中的某个位置
  • Protractor - Jasmine - 将文件下载到相对路径

    我已阅读并遵循以下问题及其评论 答案 问题1 https stackoverflow com questions 27785731 cant stop protractor from displaying file download pro
  • 从 Python 文档字符串自动生成 GitHub Wiki 文档

    标题说明了一切 我的想法是为我的所有模块 类和函数提供文档字符串 并以某种方式通过 github wiki 很好地导航文档 此外 该文档应与最新代码同步 这意味着它应在推送时更新 重新生成 那可能吗 只需通过管道传输生成的输出docstri
  • __getitem__, __setitem__ 多个键

    我正在尝试创建一个类 它将数据存储在本地缓冲区中 并充当数据库的接口 我有以下代码 class Table object def init self tableName columnDict self tableName tableName
  • Python 与 QML (Qt-Quick) 配合得很好吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 Qt Quick 的初学者 我不知道 Qt 是 QML 的基础 而且我也不熟悉 C 它又是 Qt 和 QML 的主要支持语言 我
  • 为什么 assembleDebug 比项目构建花费的时间要长得多以及如何优化它?

    我最近一直在处理 Android Studio 中的 gradle 构建时间 通过删除一些依赖项 我成功地将构建时间从大约 3 分钟减少到 10 秒 但事情是这样的 当我重建项目时 大约需要 10 秒 15 13 43 Executing
  • 显示为问号的特殊字符

    使用 Python 编程语言时 我在输出 和 等字符时遇到问题 以下代码给出了一个问号 作为输出 而不是 coding iso 8859 1 input print input 以下代码可让您输入随机文本 for 循环遍历输入的每个字符 将
  • Tinymce:拼写检查器不工作

    我在用spellchecker for tinymce在我的应用程序中 拼写检查器内部使用Moxiecode TinyMCE dll 在我们上次实时更新之前它运行良好 突然就报错了You must write ContentLength b
  • NestJS + CASL + Mongoose:CASL 无法从 Mongoose Schema 推断主题类型

    Context 我定义了一个Cat使用 Mongoose 和 NestJS 的架构 import Prop Schema SchemaFactory from nestjs mongoose import Document from mon
  • VBA - 检查列表对象中的数据是否被过滤

    我正在尝试开发一个自定义函数来检查列表对象中的数据是否被过滤 Public Function TestFiltered As Boolean Dim rngFilter As Range Dim r As Long f As Long Se
  • 从哪里获取与 timezone-js 配合使用的 Olson 时区数据库文件?

    根据 timezone js 的自述文件 http github com mde timezone js http github com mde timezone js 您需要下载 Olson 时区数据库并将文件存储在 Web 服务器上的目
  • Postgres where 子句来自子查询的两列

    数据库 Postgres 表名 records 有 4 列Year Dept Expense Month 因此 每年每个月 每个部门最多可以有一条记录 我有一个子查询 它根据约束返回以下数据 Year Dept 2001 HR 2001 A
  • AS 中的内部类

    例如 package public class A var test String public function A class B 代码在同一个文件中 我们称B为内部类 那么如何调用B类的构造函数 package public clas
  • XML文档选择

    我的 XML 文档格式如下
  • 如何使用systemjs导入fullcalendar v.3.0.1?

    我有app ts import moment from moment moment import from jquery import fullcalendar fullcalendar calendar fullCalendar 但出现
  • Node.js 中的 WordPress 身份验证

    允许用户使用 WordPress 页面中的用户帐户使用 Node js 应用程序的最佳方式是什么 我尝试过在 Redis 中存储会话信息 但我对 PHP 不太熟悉 并且遇到了不存储会话的死胡同 我用过这个guide http simplap