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

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>
<body>
<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>
</body>
</html>

View File

@ -88,11 +88,35 @@ function LoginPage({ onLogin }) {
const [autoDingtalkLogin, setAutoDingtalkLogin] = useState(false);
const autoLoginStarted = useRef(false);
const query = new URLSearchParams(window.location.search);
const inDingtalkWorkbench = /DingTalk|AliApp\(DT/i.test(navigator.userAgent || "") || query.get("from") === "dingtalk";
function requestDingTalkAuthCode(corpId) {
const inDingtalkWorkbench = /DingTalk|AliApp\(DT/i.test(navigator.userAgent || "") || query.get("from") === "dingtalk" || Boolean(window.dd || window.DingTalkPC);
function loadDingTalkSdk() {
if (window.dd) return Promise.resolve(window.dd);
return new Promise((resolve, reject) => {
const ding = window.dd;
if (!ding) return reject(new Error("未检测到钉钉工作台环境,请从钉钉工作台打开"));
const existing = document.querySelector('script[data-dingtalk-sdk="true"]');
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;
const finish = (callback) => (value) => {
if (settled) return;
@ -106,7 +130,9 @@ function LoginPage({ onLogin }) {
const failure = finish((error) => reject(new Error(error?.errorMessage || error?.message || "钉钉免登授权失败")));
const invoke = () => {
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) {
failure(error);
}