你只需要填一张表,就能拿到可直接使用的接入代码
access_token 后,必须在你的服务端做 JWT 验签,并强制校验 exp 没过期(缺失 exp 的 Token 一律拒绝)。详细方法见底部开发者参考。
整个登录过程一共四步,二维码过期时间为 150 秒,前端每 2 秒轮询一次状态。
填好下面的信息,点一下"生成代码",复制或下载就能用。整个页面不会保存你填的任何信息,关掉页面就什么都没了。
app_secret 只能放在服务端,严禁暴露到前端页面或 App 里。前端一键登录(方式 A)为便捷方案:页面只需传门禁卡 app_key,钥匙 app_secret 由 qrcode 站点服务端托管代签,前端永不接触,也不会出现在生成的代码里;正式生产环境也可使用方式 B(服务端接入,凭据只在服务端)。本页面不会保存你填写的任何信息(不使用 localStorage / sessionStorage / cookie)。
app_key(yoshost_ 开头)再回来填写(生成器右上角必填项)。还没登记?联系站长完成登记即可,登记后门禁卡 app_key 与钥匙 app_secret 只显示一次,请妥善保存;钥匙已由 qrcode 站点服务端托管,方式 A 前端只需门禁卡。
app_key(yoshost_ 开头);钥匙 app_secret 由 qrcode 站点服务端托管,前端不用管。access_token 验签(别忘了强制校验 exp),登录完成。点击"导出接入指南",会把下面的说明 + 你生成的代码打包成一个 Markdown 文件下载到本地,方便存档或发给同事。
app_key 请求一键登录接口 https://auth.ycceo.com/qrcode/yoslogin.php 发起会话,钥匙 app_secret 由 qrcode 站点服务端托管代签,前端永不接触。接口在服务端自动生成二维码,你的页面只管展示二维码、轮询状态、授权成功跳转。门禁卡可公开给前端,不会泄露钥匙。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)。access_token 是一个标准 JWT,任何人拿到都能解码出 payload。如果在前端只做解码就放行,等于把登录判断交给攻击者。必须在你的服务端用密钥验签,确认 Token 是你签发的、没被篡改;同时强制校验 exp,缺失或已过期的 Token 一律拒绝,防止"永恒 Token"。app_secret 是你的钥匙,放在前端页面或 App 里等于把钥匙贴在门上。方式 A(前端一键登录)就是为此设计:钥匙由 qrcode 站点服务端托管,前端只需门禁卡 app_key 请求 https://auth.ycceo.com/qrcode/yoslogin.php,由服务端代签,前端永不接触钥匙。方式 B 则要求钥匙只存在于你的服务端。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_key(公开标识),钥匙 app_secret(签名密钥)由 qrcode 站点服务端托管。方式 A 调用 https://auth.ycceo.com/qrcode/yoslogin.php 时服务端用托管钥匙代签,前端全程不接触钥匙;方式 B 才需要把钥匙放到你自己的服务端用于验签。这样既方便又安全。整个认证系统分为两层:YOS-Pass 站点(auth.ycceo.com/YOS-Pass/,负责托管登记、门禁卡与钥匙管理、接入代码生成、文档)与 qrcode 认证服务(负责二维码生成、会话管理、一键登录、JWT 签发与验签)。接入方通过 app_key(门禁卡,公开)+ app_secret(钥匙,仅服务端)与两个服务交互。
app_key 请求 https://auth.ycceo.com/qrcode/yoslogin.php 发起会话,服务端托管钥匙代签并生成二维码;前端展示二维码、每 2 秒轮询 https://auth.ycceo.com/YOS-Pass/api/session_status.php,授权成功后携带 access_token 跳转。钥匙永不接触前端。app_key + app_secret 对请求体做 HMAC-SHA256 签名,带 X-Request-Signature 头调用 https://auth.ycceo.com/YOS-Pass/api/start_login.php;前端轮询状态;服务端对 access_token 做 JWT 验签(强制 exp)。渲染二维码图片,返回 PNG 图片流。二维码内容由服务端按 app_key + 会话参数拼接生成,7 天过期机制由 QR_EXPIRY_DAYS 配置控制。
一键登录入口(方式 A):前端提交门禁卡 app_key 及回调参数,服务端用托管钥匙代签、创建会话并返回二维码内容 / 会话 ID(响应带 qr_url 与 session_id)。前端无需也禁止携带 app_secret。
方式 B:服务端用 app_key + app_secret 做 HMAC-SHA256 签名,携带 X-Request-Signature 请求头调用,创建会话并返回二维码内容 / 会话 ID。
查询会话状态:pending(等待扫码)/ success(授权成功,返回 access_token)/ expired(过期)。前端每 2 秒轮询一次。
app_secret。X-Request-Signature 请求头。header.payload.signature;签名原文为 headerB64.payloadB64(中间一个点);签名密钥 = 你的 app_secret;验签后强制校验 exp,缺失 / 过期一律拒绝。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 )
| 错误码 | 含义 | 排查建议 |
|---|---|---|
| 0 | 成功 | 无需处理 |
| 10001 | 参数缺失 | 检查必填参数是否齐全 |
| 10002 | 参数格式错误 | 对照文档检查参数类型/长度 |
| 10003 | app_key 不存在或已禁用 | 检查门禁卡是否登记/启用 |
| 10004 | 签名校验失败 | 检查 HMAC-SHA256 密钥与签名原文格式 |
| 10005 | 请求已过期 / 时间戳偏差过大 | 校准服务端时间,缩短重放窗口 |
| 10006 | 会话不存在 | session_id 无效,重新发起登录 |
| 10007 | 会话已过期 | 刷新二维码重新发起 |
| 10008 | 会话状态异常 | 联系管理员查看服务端日志 |
| 10009 | 二维码生成失败 | 检查 qrcode 渲染库与参数 |
| 10010 | access_token 无效 | 重新发起登录流程 |
| 10011 | access_token 已过期 | 校验 exp,过期需重新登录 |
| 10012 | access_token 签名错误 | 核对验签密钥与签名原文拼接方式 |
| 10013 | access_token 缺失 exp 字段 | 必须强制校验 exp,缺失一律拒绝 |
| 10014 | 接口调用频率超限 | 降低轮询频率,等待后再试 |
| 10015 | 服务端内部错误 | 查看服务端日志,联系管理员 |
| 10016 | 请求被拒绝(安全拦截) | 检查 UA/来源/频率是否触发风控 |
| 10017 | 会话状态查询不可用 | 稍后重试 / 检查网络 |
| 10018 | 二维码渲染库加载失败 | 检查 qrcode.min.js 路径与加载 |
| 10019 | 未知错误 | 收集上下文信息联系管理员 |
app_secret 只允许存在于服务端,严禁出现在前端页面、源码、App 或日志里。verifyYosToken() 等标准库,强制校验 exp,缺失 exp 的 Token 一律拒绝,防止"永恒 Token"。CURLOPT_SSL_VERIFYPEER = true。https://auth.ycceo.com/qrcode/api.php 生成二维码,由 YOS IOA App 扫码授权,不能自签 JWT 绕过。