扫码认证 · 一分钟接入

YOS-Pass 统一身份认证

你只需要填一张表,就能拿到可直接使用的接入代码

扫码登录 服务端强制验签 密钥隔离 移动端适配 零浏览器储存
二维码生成服务:2 元 / 次
一句话接入须知: 收到 access_token 后,必须在你的服务端做 JWT 验签,并强制校验 exp 没过期(缺失 exp 的 Token 一律拒绝)。详细方法见底部开发者参考
登录原理(30 秒看懂)

整个登录过程一共四步,二维码过期时间为 150 秒,前端每 2 秒轮询一次状态。

① 扫码 用户用 YOS 万象 IOA App 扫描页面上的二维码
② 授权确认 手机 App 弹出授权页,用户点击确认授权
③ 服务端验签 授权成功后返回 access_token,你的服务端验签并校验 exp
④ 登录成功 页面自动跳转,用户进入你的网站
接入代码生成器

填好下面的信息,点一下"生成代码",复制或下载就能用。整个页面不会保存你填的任何信息,关掉页面就什么都没了。

选择接入方式
前端一键登录 推荐 · 最简单
生成一个独立的 .html 登录页:自动出二维码、自动轮询、授权成功自动跳转。登录时只需传门禁卡 app_key,钥匙 app_secret 由 qrcode 站点服务端托管代签,前端永不接触。你只要把文件放进网站就能用。
适合:个人网站、演示站、想 5 分钟跑通。门禁卡 app_key 可公开给前端,钥匙 app_secret 只在服务端,永不随代码下发。
PHP 服务端完整接入 更安全
生成一个填好参数的 .php 登录页:服务端签名发起登录、前端轮询、服务端 JWT 验签(强制校验 exp)。
适合:正式上线、需要服务端验签、自己控制流程
给 AI 的稳定链接: 把完整文档直接丢给 AI,AI 会记忆旧 URL,参数更新后仍拿旧副本导致报错;此链接是稳定入口,AI 每次访问都会实时拿到服务端最新版接入文档。
重要提醒: app_secret 只能放在服务端,严禁暴露到前端页面或 App 里。前端一键登录(方式 A)便捷方案:页面只需传门禁卡 app_key,钥匙 app_secret 由 qrcode 站点服务端托管代签,前端永不接触,也不会出现在生成的代码里;正式生产环境也可使用方式 B(服务端接入,凭据只在服务端)。本页面不会保存你填写的任何信息(不使用 localStorage / sessionStorage / cookie)。
生成前必读: 请先完成托管登记,获得专属门禁卡 app_keyyoshost_ 开头)再回来填写(生成器右上角必填项)。还没登记?联系站长完成登记即可,登记后门禁卡 app_key 与钥匙 app_secret 只显示一次,请妥善保存;钥匙已由 qrcode 站点服务端托管,方式 A 前端只需门禁卡。
示例凭据(只读,供参考):
app_key:yosapp_4b02c8fed312b55a7b13a1d0b136cf40
app_secret:c9f4efab14073ad240456d8c63bf55c72bee44c28c790816398a6b5dfb59c96c
以上为示例值,仅用于对照格式,正式使用请完成托管登记获取自己的凭据。
你只需要做这几步
  1. 拿到门禁卡:完成托管登记,你会得到一把专属门禁卡 app_keyyoshost_ 开头);钥匙 app_secret 由 qrcode 站点服务端托管,前端不用管。
  2. 生成代码:在上面的生成器里填好信息,选一种接入方式,点"生成代码"。
  3. 放进网站:复制生成的代码,或直接下载文件,放到你的服务器上(前端模式放静态目录,PHP 模式放到 PHP 站点)。
  4. 用户扫码:用户用 YOS 万象 IOA App 扫你页面上的二维码,手机上点一下确认授权。
  5. 完成登录:授权成功后自动跳到你的页面,你的服务端对返回的 access_token 验签(别忘了强制校验 exp),登录完成。
接入说明(随文档导出)

点击"导出接入指南",会把下面的说明 + 你生成的代码打包成一个 Markdown 文件下载到本地,方便存档或发给同事。

  • 前端一键登录(方式 A):页面只需传门禁卡 app_key 请求一键登录接口 https://auth.ycceo.com/qrcode/yoslogin.php 发起会话,钥匙 app_secret 由 qrcode 站点服务端托管代签,前端永不接触。接口在服务端自动生成二维码,你的页面只管展示二维码、轮询状态、授权成功跳转。门禁卡可公开给前端,不会泄露钥匙。
  • PHP 服务端完整接入(方式 B):你的服务端用 app_key + app_secret 对请求体做 HMAC-SHA256 签名,带 X-Request-Signature 请求头调用 https://auth.ycceo.com/YOS-Pass/api/start_login.php;前端轮询 https://auth.ycceo.com/YOS-Pass/api/session_status.php;拿到 access_token 后在服务端用 verifyYosToken() 验签(标准 base64、签名原文为 headerB64.payloadB64、签名密钥 = 你的 app_secret强制校验 exp)。
常见问题(FAQ)
为什么强调"必须服务端验签 + 校验 exp"?
因为 access_token 是一个标准 JWT,任何人拿到都能解码出 payload。如果在前端只做解码就放行,等于把登录判断交给攻击者。必须在你的服务端用密钥验签,确认 Token 是你签发的、没被篡改;同时强制校验 exp,缺失或已过期的 Token 一律拒绝,防止"永恒 Token"。
app_secret 可以放在前端吗?
绝对不可以。app_secret 是你的钥匙,放在前端页面或 App 里等于把钥匙贴在门上。方式 A(前端一键登录)就是为此设计:钥匙由 qrcode 站点服务端托管,前端只需门禁卡 app_key 请求 https://auth.ycceo.com/qrcode/yoslogin.php,由服务端代签,前端永不接触钥匙。方式 B 则要求钥匙只存在于你的服务端。
二维码有效期多长?过期了怎么办?
二维码默认 150 秒过期(由服务端 QR_EXPIRY_DAYS/QR_TTL 控制)。前端每 2 秒轮询一次状态,过期后界面会提示"二维码已过期",点一下"刷新二维码"按钮即可重新生成,无需刷新整个页面。
登录成功后如何拿到用户信息?
授权成功后返回的 access_token(JWT)的 payload 里带有用户标识(如 uid / openid / user_info 等字段)。在你的服务端验签成功后,从解码出的 payload 读取即可,切勿相信未经服务端验签的前端解码结果。
页面二维码显示不出来 / 一直在转?
按顺序检查:①浏览器地址是否允许访问 qrcode.min.js(需 http/https,本地 file:// 打开可能被拦);②网络是否能访问 auth.ycceo.com;③app_key 是否正确且未过期;④控制台是否有报错(F12)。还有疑问把报错截图发到「技术支持」联系方式,我会尽快帮你排查。
为什么有的登录方式没用到 app_secret?
这是门禁卡分离改造后的设计:登录时你只需门禁卡 app_key(公开标识),钥匙 app_secret(签名密钥)由 qrcode 站点服务端托管。方式 A 调用 https://auth.ycceo.com/qrcode/yoslogin.php 时服务端用托管钥匙代签,前端全程不接触钥匙;方式 B 才需要把钥匙放到你自己的服务端用于验签。这样既方便又安全。
开发者速查

最常用的东西,一卡直达

开发者参考(API / 签名 / 错误码 / 安全建议)点击展开

架构总览

整个认证系统分为两层:YOS-Pass 站点auth.ycceo.com/YOS-Pass/,负责托管登记、门禁卡与钥匙管理、接入代码生成、文档)与 qrcode 认证服务(负责二维码生成、会话管理、一键登录、JWT 签发与验签)。接入方通过 app_key(门禁卡,公开)+ app_secret(钥匙,仅服务端)与两个服务交互。

接入方式

  • 方式 A · 前端一键登录:前端只带门禁卡 app_key 请求 https://auth.ycceo.com/qrcode/yoslogin.php 发起会话,服务端托管钥匙代签并生成二维码;前端展示二维码、每 2 秒轮询 https://auth.ycceo.com/YOS-Pass/api/session_status.php,授权成功后携带 access_token 跳转。钥匙永不接触前端。
  • 方式 B · PHP 服务端完整接入:服务端用 app_key + app_secret 对请求体做 HMAC-SHA256 签名,带 X-Request-Signature 头调用 https://auth.ycceo.com/YOS-Pass/api/start_login.php;前端轮询状态;服务端对 access_token 做 JWT 验签(强制 exp)。

二维码生成与一键登录接口

GET https://auth.ycceo.com/qrcode/api.php

渲染二维码图片,返回 PNG 图片流。二维码内容由服务端按 app_key + 会话参数拼接生成,7 天过期机制由 QR_EXPIRY_DAYS 配置控制。

POST https://auth.ycceo.com/qrcode/yoslogin.php

一键登录入口(方式 A):前端提交门禁卡 app_key 及回调参数,服务端用托管钥匙代签、创建会话并返回二维码内容 / 会话 ID(响应带 qr_urlsession_id)。前端无需也禁止携带 app_secret

POST https://auth.ycceo.com/YOS-Pass/api/start_login.php

方式 B:服务端用 app_key + app_secret 做 HMAC-SHA256 签名,携带 X-Request-Signature 请求头调用,创建会话并返回二维码内容 / 会话 ID。

GET https://auth.ycceo.com/YOS-Pass/api/session_status.php?session_id=xxx&app_key=xxx

查询会话状态:pending(等待扫码)/ success(授权成功,返回 access_token)/ expired(过期)。前端每 2 秒轮询一次。

签名与验签规范

  • 请求体字符串为 原始 JSON body 的 UTF-8 字节
  • HMAC-SHA256 的密钥 = 你的 app_secret
  • 签名结果 Base64 后放入 X-Request-Signature 请求头。
  • JWT 验签:标准 base64 拆分 header.payload.signature签名原文为 headerB64.payloadB64(中间一个点);签名密钥 = 你的 app_secret;验签后强制校验 exp,缺失 / 过期一律拒绝。

JWT 结构说明

header.payload.signature
// header(头部):
{"alg":"HS256","typ":"JWT"}
// payload(载荷)关键字段:
//   exp  过期时间戳(秒,必校验)
//   iat  签发时间戳
//   app_key  门禁卡标识
//   uid / openid / user_info  用户标识(授权成功时写入)
// signature = HMAC_SHA256( base64(header)+"."+base64(payload), app_secret )

错误码对照表(20 项)

错误码含义排查建议
0成功无需处理
10001参数缺失检查必填参数是否齐全
10002参数格式错误对照文档检查参数类型/长度
10003app_key 不存在或已禁用检查门禁卡是否登记/启用
10004签名校验失败检查 HMAC-SHA256 密钥与签名原文格式
10005请求已过期 / 时间戳偏差过大校准服务端时间,缩短重放窗口
10006会话不存在session_id 无效,重新发起登录
10007会话已过期刷新二维码重新发起
10008会话状态异常联系管理员查看服务端日志
10009二维码生成失败检查 qrcode 渲染库与参数
10010access_token 无效重新发起登录流程
10011access_token 已过期校验 exp,过期需重新登录
10012access_token 签名错误核对验签密钥与签名原文拼接方式
10013access_token 缺失 exp 字段必须强制校验 exp,缺失一律拒绝
10014接口调用频率超限降低轮询频率,等待后再试
10015服务端内部错误查看服务端日志,联系管理员
10016请求被拒绝(安全拦截)检查 UA/来源/频率是否触发风控
10017会话状态查询不可用稍后重试 / 检查网络
10018二维码渲染库加载失败检查 qrcode.min.js 路径与加载
10019未知错误收集上下文信息联系管理员

安全建议(必读)

  • app_secret 只允许存在于服务端,严禁出现在前端页面、源码、App 或日志里。
  • 验签必须用 verifyYosToken() 等标准库,强制校验 exp,缺失 exp 的 Token 一律拒绝,防止"永恒 Token"。
  • 所有接口建议启用 HTTPS;校验 CURLOPT_SSL_VERIFYPEER = true
  • 为敏感操作(删日志、重生成 app_secret、删接入方、删敏感配置)保留二次扫码授权:调用外部 https://auth.ycceo.com/qrcode/api.php 生成二维码,由 YOS IOA App 扫码授权,不能自签 JWT 绕过。
  • 接入方页面遵循零浏览器储存约束:不使用 localStorage / sessionStorage / cookie 保存敏感信息,导出走一次性 Blob URL。
  • 定期轮换 app_secret;发现泄露立即重新生成并下线旧密钥。
技术支持

有任何问题,欢迎随时联系我