如何在FastAPI中生成与WordPress兼容的密码哈希,实现移动端API登录对接
如何在FastAPI中生成与WordPress兼容的密码哈希,实现移动端API登录对接
嗨,我刚好之前做过类似的WordPress和FastAPI登录对接,给你一步步理清楚怎么弄:
首先得明确一点:WordPress的密码哈希用的是phpass的Portable PHP Password Hashing Framework,也就是你在数据库里看到的以$P$或者$H$开头的哈希值。你用的passlib.phpass完全能搞定这个,而且你在wp-config.php里看到的那些AUTH_KEY、各种SALT其实和密码哈希没关系——那些是用来做会话验证、非ce签名的,密码哈希的salt是每个密码单独生成并存在哈希字符串里的,所以不用管那些全局配置。
接下来是具体的实现步骤:
1. 先安装passlib
如果还没装的话,先在你的FastAPI项目环境里执行安装命令:
pip install passlib
2. 配置phpass上下文匹配WordPress的规则
WordPress对phpass的配置是固定的,你需要把passlib的PhpassContext配置成和它一致的参数:
- 开启
portable=True:这是WordPress采用的兼容模式 - 迭代次数(rounds)设为8:WordPress默认的迭代次数
- 哈希算法用MD5:虽然MD5不算强,但WordPress一直保留这个配置来兼容老版本
3. 生成与WordPress兼容的密码哈希代码示例
你可以写一个工具函数,在FastAPI里用来生成符合要求的哈希,比如:
from passlib.context import CryptContext # 配置符合WordPress的phpass上下文 pwd_context = CryptContext( schemes=["phpass"], phpass__default_rounds=8, phpass__portable=True ) def generate_wordpress_hash(password: str) -> str: # 生成的哈希结果可直接存入WordPress的wp_users表user_pass字段 return pwd_context.hash(password)
4. 登录时验证密码的代码示例
当移动端用户输入密码后,你需要从WordPress数据库取出对应的user_pass哈希值,然后用passlib做对比验证:
def verify_wordpress_password(plain_password: str, hashed_password: str) -> bool: # 对比明文密码与WordPress存储的哈希值 return pwd_context.verify(plain_password, hashed_password)
举个实际用在FastAPI接口里的例子,比如一个登录接口:
from fastapi import FastAPI, HTTPException import mysql.connector # 假设你用MySQL连接WordPress数据库 app = FastAPI() # 替换为你的WordPress数据库连接信息 db_config = { "host": "your_db_host", "user": "your_db_user", "password": "your_db_pass", "database": "your_wordpress_db" } @app.post("/mobile-login") def mobile_login(username: str, password: str): # 从WordPress数据库获取用户的哈希密码 conn = mysql.connector.connect(**db_config) cursor = conn.cursor(dictionary=True) cursor.execute("SELECT user_pass FROM wp_users WHERE user_login = %s", (username,)) user = cursor.fetchone() cursor.close() conn.close() if not user: raise HTTPException(status_code=401, detail="用户不存在") # 验证密码合法性 if not verify_wordpress_password(password, user["user_pass"]): raise HTTPException(status_code=401, detail="密码错误") # 这里可以生成移动端会话token,比如JWT return {"status": "success", "message": "登录成功", "token": "your_generated_jwt_token"}
最后再强调一下:完全不用碰wp-config.php里的那些全局salt,密码哈希的逻辑和它们没有任何关系,你只需要按照上面的配置用passlib生成/验证哈希,就能完美和WordPress兼容了。
备注:内容来源于stack exchange,提问作者Anthony Aniobi
相关产品推荐
相关产品推荐

