修改钉钉工作台免登环境识别
This commit is contained in:
parent
5b10096bbf
commit
551c68c456
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user