修改钉钉工作台免登环境识别

This commit is contained in:
kx_guo 2026-09-05 17:47:31 +08:00
parent 5b10096bbf
commit 551c68c456
2 changed files with 32 additions and 6 deletions

View File

@ -7,7 +7,7 @@
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.15.15/dingtalk.open.js"></script> <script data-dingtalk-sdk="true" src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.15.15/dingtalk.open.js"></script>
<script type="module" src="/src/main.jsx"></script> <script type="module" src="/src/main.jsx"></script>
</body> </body>
</html> </html>

View File

@ -88,11 +88,35 @@ function LoginPage({ onLogin }) {
const [autoDingtalkLogin, setAutoDingtalkLogin] = useState(false); const [autoDingtalkLogin, setAutoDingtalkLogin] = useState(false);
const autoLoginStarted = useRef(false); const autoLoginStarted = useRef(false);
const query = new URLSearchParams(window.location.search); const query = new URLSearchParams(window.location.search);
const inDingtalkWorkbench = /DingTalk|AliApp\(DT/i.test(navigator.userAgent || "") || query.get("from") === "dingtalk"; const inDingtalkWorkbench = /DingTalk|AliApp\(DT/i.test(navigator.userAgent || "") || query.get("from") === "dingtalk" || Boolean(window.dd || window.DingTalkPC);
function requestDingTalkAuthCode(corpId) { function loadDingTalkSdk() {
if (window.dd) return Promise.resolve(window.dd);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const ding = window.dd; const existing = document.querySelector('script[data-dingtalk-sdk="true"]');
if (!ding) return reject(new Error("未检测到钉钉工作台环境,请从钉钉工作台打开")); const finish = () => {
if (window.dd) resolve(window.dd);
else reject(new Error("钉钉JSAPI未加载,请确认工作台应用类型为H5微应用,并将 ask.dieya.net.cn 加入应用安全域名"));
};
if (existing) {
existing.addEventListener("load", finish, { once: true });
existing.addEventListener("error", finish, { once: true });
window.setTimeout(finish, 5000);
return;
}
const script = document.createElement("script");
script.src = "https://g.alicdn.com/dingding/dingtalk-jsapi/2.15.15/dingtalk.open.js";
script.async = true;
script.dataset.dingtalkSdk = "true";
script.onload = finish;
script.onerror = finish;
document.head.appendChild(script);
window.setTimeout(finish, 8000);
});
}
async function requestDingTalkAuthCode(corpId) {
const ding = (await loadDingTalkSdk()) || window.dd || window.DingTalkPC;
return new Promise((resolve, reject) => {
if (!ding) return reject(new Error("未检测到钉钉JSAPI,请将当前地址配置为钉钉H5微应用首页,并加入应用安全域名"));
let settled = false; let settled = false;
const finish = (callback) => (value) => { const finish = (callback) => (value) => {
if (settled) return; if (settled) return;
@ -106,7 +130,9 @@ function LoginPage({ onLogin }) {
const failure = finish((error) => reject(new Error(error?.errorMessage || error?.message || "钉钉免登授权失败"))); const failure = finish((error) => reject(new Error(error?.errorMessage || error?.message || "钉钉免登授权失败")));
const invoke = () => { const invoke = () => {
try { try {
ding.runtime.permission.requestAuthCode({ corpId, onSuccess: success, onFail: failure }); const requestAuthCode = ding.runtime?.permission?.requestAuthCode || ding.permission?.requestAuthCode;
if (!requestAuthCode) throw new Error("当前钉钉版本不支持工作台免登JSAPI");
requestAuthCode.call(ding.runtime?.permission || ding.permission, { corpId, onSuccess: success, onFail: failure });
} catch (error) { } catch (error) {
failure(error); failure(error);
} }