{"id":5537,"date":"2026-02-04T21:30:13","date_gmt":"2026-02-04T13:30:13","guid":{"rendered":"https:\/\/liyue.name\/?p=5537"},"modified":"2026-02-04T21:30:13","modified_gmt":"2026-02-04T13:30:13","slug":"%e6%9f%a5%e8%af%a2%e7%a7%9f%e6%88%b7id%ef%bc%88microsoft-365azure%ef%bc%89","status":"publish","type":"post","link":"https:\/\/liyue.name\/?p=5537","title":{"rendered":"\u67e5\u8be2\u79df\u6237ID\uff08Microsoft 365&amp;Azure\uff09"},"content":{"rendered":"\n<p>\u5feb\u901f\u67e5\u8be2\u5fae\u8f6f\u79df\u6237ID<\/p>\n\n\n\n<!--more-->\n\n\n\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\" \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n<title>\u67e5\u8be2\u79df\u6237ID<\/title>\n<style>\n  :root { color-scheme: light dark; }\n  body {\n    font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;\n    margin: 0; padding: 16px; line-height: 1.6;\n  }\n  .container { max-width: 720px; margin: 0; }\n  label { display: block; margin-bottom: 8px; font-weight: 600; }\n  input[type=\"text\"] {\n    width: 100%; padding: 10px 12px; border: 1px solid #ccc; border-radius: 8px;\n    font-size: 16px; box-sizing: border-box;\n  }\n  button {\n    margin-top: 12px; padding: 10px 14px; border: 0; border-radius: 8px; font-size: 16px;\n    background: #0a66ff; color: #fff; cursor: pointer;\n  }\n  button:disabled { opacity: 0.6; cursor: not-allowed; }\n  .hint { font-size: 13px; color: #666; margin-top: 6px; }\n  .result { margin-top: 18px; padding: 12px; border-radius: 8px; background: rgba(0,0,0,0.04); }\n  .row { margin: 8px 0; word-break: break-all; }\n  .label { font-weight: 600; }\n  .error { color: #b00020; }\n  .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace; }\n<\/style>\n<\/head>\n<body>\n  <div class=\"container\">\n    <!-- \u53bb\u6389\u6807\u9898 -->\n    <label for=\"name\">\u8bf7\u8f93\u5165\u57df\u540d\uff08\u516c\u53f8\u57df\u540d\u6216 @xxx.onmicrosoft.com \u57df\u540d\uff09<\/label>\n    <input type=\"text\" id=\"name\" placeholder=\"\u4f8b\u5982\uff1acontoso.com \u6216 contoso.onmicrosoft.com\" \/>\n    <div class=\"hint\">\u5c06\u8bbf\u95ee\uff1ahttps:\/\/login.microsoftonline.com\/[\u4f60\u7684\u8f93\u5165]\/.well-known\/openid-configuration<\/div>\n    <button id=\"submit\">\u67e5\u8be2<\/button>\n\n    <div id=\"status\" class=\"hint\" aria-live=\"polite\"><\/div>\n\n    <div id=\"output\" class=\"result\" style=\"display:none;\">\n      <div class=\"row\"><span class=\"label\">token_endpoint\uff1a<\/span> <span id=\"token\" class=\"mono\"><\/span><\/div>\n      <div class=\"row\"><span class=\"label\">\u63d0\u53d6\u51fa\u7684\u79df\u6237ID\uff1a<\/span> <span id=\"tenant\" class=\"mono\"><\/span><\/div>\n    <\/div>\n  <\/div>\n\n<script>\n(function(){\n  const $ = (id) => document.getElementById(id);\n  const input = $(\"name\");\n  const btn = $(\"submit\");\n  const statusEl = $(\"status\");\n  const output = $(\"output\");\n  const tokenEl = $(\"token\");\n  const tenantEl = $(\"tenant\");\n\n  function setLoading(loading, msg=\"\") {\n    btn.disabled = loading;\n    statusEl.textContent = msg;\n  }\n\n  function extractTenantIdFromTokenEndpoint(url) {\n    try {\n      const u = new URL(url);\n      const parts = u.pathname.split(\"\/\").filter(Boolean);\n      \/\/ \u5f62\u5982 \/{tenant}\/oauth2\/token \u6216 \/{tenant}\/oauth2\/v2.0\/token\n      return parts.length > 0 ? decodeURIComponent(parts[0]) : \"\";\n    } catch {\n      const m = String(url).match(\/^https:\\\/\\\/login\\.microsoftonline\\.com\\\/([^\/]+)\\\/oauth2(\\\/v2\\.0)?\\\/token\/i);\n      return m ? decodeURIComponent(m[1]) : \"\";\n    }\n  }\n\n  async function fetchConfig(tenantInput) {\n    const base = \"https:\/\/login.microsoftonline.com\";\n    const url = `${base}\/${encodeURIComponent(tenantInput)}\/.well-known\/openid-configuration`;\n    setLoading(true, \"\u6b63\u5728\u8bf7\u6c42 OpenID \u914d\u7f6e\u2026\");\n    try {\n      const res = await fetch(url, { mode: \"cors\" });\n      if (!res.ok) throw new Error(`\u8bf7\u6c42\u5931\u8d25\uff1aHTTP ${res.status}`);\n      const data = await res.json();\n\n      const tokenEndpoint = data.token_endpoint || \"\";\n      const extracted = tokenEndpoint ? extractTenantIdFromTokenEndpoint(tokenEndpoint) : \"\";\n\n      output.style.display = \"block\";\n      tokenEl.textContent = tokenEndpoint || \"(\u672a\u8fd4\u56de token_endpoint)\";\n      tenantEl.textContent = extracted || \"(\u672a\u80fd\u63d0\u53d6)\";\n      statusEl.textContent = \"\u5b8c\u6210\u3002\";\n    } catch (e) {\n      output.style.display = \"none\";\n      statusEl.innerHTML = \"\";\n      const err = document.createElement(\"div\");\n      err.className = \"error\";\n      err.textContent = e.message || \"\u8bf7\u6c42\u51fa\u9519\";\n      statusEl.appendChild(err);\n    } finally {\n      setLoading(false);\n    }\n  }\n\n  btn.addEventListener(\"click\", () => {\n    const name = input.value.trim();\n    if (!name) {\n      statusEl.textContent = \"\u8bf7\u8f93\u5165\u57df\u540d\uff08\u516c\u53f8\u57df\u540d\u6216 @xxx.onmicrosoft.com \u57df\u540d\uff09\u3002\";\n      return;\n    }\n    fetchConfig(name);\n  });\n\n  input.addEventListener(\"keydown\", (e) => {\n    if (e.key === \"Enter\") btn.click();\n  });\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>\u5feb\u901f\u67e5\u8be2\u5fae\u8f6f\u79df\u6237ID<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[478],"class_list":["post-5537","post","type-post","status-publish","format-standard","hentry","category-microsoft","tag-478"],"_links":{"self":[{"href":"https:\/\/liyue.name\/index.php?rest_route=\/wp\/v2\/posts\/5537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liyue.name\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liyue.name\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liyue.name\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liyue.name\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5537"}],"version-history":[{"count":1,"href":"https:\/\/liyue.name\/index.php?rest_route=\/wp\/v2\/posts\/5537\/revisions"}],"predecessor-version":[{"id":5539,"href":"https:\/\/liyue.name\/index.php?rest_route=\/wp\/v2\/posts\/5537\/revisions\/5539"}],"wp:attachment":[{"href":"https:\/\/liyue.name\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liyue.name\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liyue.name\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}