You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ERPNext如何无需密码生成用户会话,满足移动端人脸认证登录需求

ERPNext 无密码生成合法用户会话解决方案

核心实现逻辑

ERPNext 自身的登录管理器支持跳过密码校验,在你已经通过人脸完成身份有效性核验的前提下,直接对指定用户生成合法会话,不需要获取用户明文密码。

具体实现步骤

  • 首先在你的自定义 ERPNext 应用中新建白名单 API 接口,用于接收移动端传入的用户ID、人脸校验通过凭证等参数
  • 接口内部先完成自定义身份校验:先验证传入的人脸校验凭证是否合法,确认该请求确实是用户完成人脸校验后发起的有效请求,再校验传入的 UserID 对应 ERPNext 账号是否存在、状态为激活未禁用
  • 调用 ERPNext 内置的 LoginManager 直接生成会话,参考代码如下:
import frappe
from frappe.auth import LoginManager

# 标注为允许未登录用户调用的白名单接口
@frappe.whitelist(allow_guest=True)
def get_session_after_face_auth(user_id, face_verify_sign):
    # 第一步:替换为你自己的人脸校验逻辑,确认sign合法、对应用户ID正确
    if not your_face_verify_logic(user_id, face_verify_sign):
        frappe.throw("身份校验失败", frappe.PermissionError)
    
    # 第二步:校验用户账号有效性
    if not frappe.db.exists("User", {"name": user_id, "enabled": 1}):
        frappe.throw("用户账号无效", frappe.ValidationError)
    
    # 第三步:直接生成会话
    login_mgr = LoginManager()
    login_mgr.user = user_id
    login_mgr.validate() # 自动校验用户状态、权限
    login_mgr.post_login() # 生成sid、记录登录日志、更新最后登录时间
    
    # 返回会话参数给移动端
    return {
        "sid": login_mgr.sid,
        "user_id": user_id,
        "expires_in": 86400 * 7 # 默认会话有效期可自行调整
    }
  • 如果你更适配 JWT 格式的凭证用于移动端 API 调用,可以替换会话生成逻辑,直接生成 JWT 令牌:
# 替换上述第三步的LoginManager逻辑,直接生成JWT
token = frappe.jwt.get_jwt_token(user_id)
return {
    "access_token": token,
    "token_type": "Bearer",
    "expires_in": 86400 * 7
}

移动端后续请求说明

  • 如果你返回的是 sid,后续移动端请求时在请求头添加 Cookie: sid=你的sid值 即可完成身份认证
  • 如果你返回的是 JWT 令牌,后续移动端请求时在请求头添加 Authorization: Bearer 你的令牌值 即可完成身份认证

安全注意事项

  • 必须给该接口增加严格的请求校验:除了人脸校验凭证,建议增加接口签名校验、请求频率限制,避免接口被恶意调用批量生成会话
  • 人脸校验凭证必须设置有效期,禁止重复使用同一凭证多次申请会话

内容的提问来源于stack exchange,提问作者Viral Savaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:06:01