news 2026/9/3 9:24:29

Better Auth 接入 Azure AD 指南:3 步配好单租户、多租户与 CIAM 登录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Better Auth 接入 Azure AD 指南:3 步配好单租户、多租户与 CIAM 登录

Better Auth 接入 Azure AD 指南:3 步配好单租户、多租户与 CIAM 登录

【免费下载链接】better-authThe most comprehensive authentication framework项目地址: https://gitcode.com/GitHub_Trending/be/better-auth

给企业客户交付 SaaS,对方 HR 要求员工用公司账号登录,可没人想啃 OAuth2 文档。Better Auth 直接给了你一条 Azure AD(Microsoft Entra ID)登录通道:填好 clientId 和密钥,租户怎么选、令牌怎么验、头像从哪拉,都在底层处理好了,几分钟就能跑通。

⚡ 3 分钟跑通 Azure AD 登录

整个流程就三步:装包、在 Azure 门户建应用、写配置。

先装依赖(具体版本以官方文档为准):

npm install better-auth

接着在 Azure 门户的 Entra ID → App registrations 里新建一个应用:记下 Application (client) ID,再到 Certificates & secrets 生成一条客户端密码;把 Redirect URI 填成你应用里 Microsoft 的回调地址,本地开发通常是http://localhost:3000/api/auth/callback/microsoft,线上换成真实域名。

配置端只留三行最关键的东西,可选项后面按场景补:

import { betterAuth } from "better-auth"; export const auth = betterAuth({ socialProviders: { microsoft: { clientId: process.env.MICROSOFT_CLIENT_ID, clientSecret: process.env.MICROSOFT_CLIENT_SECRET, }, }, });

跑起来后,登录页点一下 "Continue with Microsoft",浏览器会跳到微软登录页,用户输完公司账号回来,你的后端已经把令牌换好、用户落库,整条链路就通了。

🔍 底层帮你拦了哪些协议细节

你不写一行 OAuth 代码,是因为下面这几件它都办了。

令牌这一头:它拿 Microsoft 的公钥端点去验返回的 ID 令牌签名,再核对颁发者、受众和签发时间;多租户场景还会额外查一次租户绑定,别家租户的令牌想混进来也进不了。

流程这一头:走的是标准授权码流程,内部自带 PKCE 的 code verifier 和 state 校验,CSRF 和中间人这两类坑不用你手动去堵。

资料这一头:令牌里的 name、email、picture 会被解析成本地用户字段,头像还会去 Graph API 拉一张按你指定尺寸裁好的图,而不是把一大段 base64 硬塞进会话。默认它会请求 openid、profile、email、User.Read、offline_access 这几项 scope,够用;要更多权限用 scope 选项追加。

🧩 按场景挑一种租户写法

单租户。只允许某一个 Azure 租户的人登录,把 tenantId 填成该租户的 GUID 即可,用户换到别的租户就会被挡在门外:

microsoft: { clientId: "你的 clientId", clientSecret: "你的 clientSecret", tenantId: "72f988bf-86f1-41af-91ab-2d7cd011db47", // 指定租户 GUID }

多租户(默认)。tenantId 不填就是 common,任何租户都能进;如果你只想收企业账号、挡住个人微软账号,就写 organizations:

microsoft: { clientId: "你的 clientId", clientSecret: "你的 clientSecret", tenantId: "organizations", // 仅企业/学校账号 }

CIAM(面向客户)。面向 C 端的客户身份场景要换 authority,tenantId 保持不动:

microsoft: { clientId: "你的 clientId", clientSecret: "你的 clientSecret", authority: "https://<tenant-id>.ciamlogin.com", }

自定义字段映射。用 mapProfileToUser 把额外字段搬进你的用户表;注意账号身份锚点 oid 是固定的,这里改不了它,只能映射本地字段:

microsoft: { clientId: "你的 clientId", clientSecret: "你的 clientSecret", mapProfileToUser: (profile) => ({ email: profile.verified_primary_email?.[0], }), }

✅ 上线前的 4 项安全检查

  • 回调地址逐字对齐。Azure 里填的 Redirect URI 和你代码里的回调必须一模一样,差一个斜杠都会直接报回调错误。
  • 密钥走环境变量。clientSecret 别写死进代码,进了版本库就等于半公开。
  • 邮箱别默认当已验证。Entra 对托管账号默认不下发 email_verified,要区分已验证邮箱,得在应用注册里把 email 配成 optional claim,或改用 verified_primary_email。
  • 头像体积。微软把头像以 base64 返回,大图可能撑爆 HTTP 头,必要时在 mapProfileToUser 里上传到自己存储或直接丢弃。

⚠️ 登录时的 3 个高频坑

  • 回调直接报错 / state 不匹配。多半是本地和 Azure 两边的 redirect URI 没对齐,把两个地址逐字核对一遍通常就好。
  • 登录成功但用户没有 email。这是 Entra 对托管账号的默认行为,去应用注册把 email 加为 optional claim,或在 mapProfileToUser 里用 verified_primary_email 兜底。
  • 升级后老账号对不上、冒出重复用户。1.7 把身份锚点从 sub 换成了 oid,按升级指南做一次一次性迁移,别直接放生产流量。

📚 延伸阅读

  • 官方配置说明与字段细节:docs/content/docs/authentication/microsoft.mdx
  • 能直接跑的完整演示:demo/nextjs/
  • OAuth 流程与无邮箱账号的处理:docs/content/docs/concepts/oauth.mdx

这套配置适合大多数 SaaS 和企业内部应用的登录场景;如果你要的是 IdP 侧的 SAML SSO,那是另一组插件的事。想看能直接跑的例子,直接翻仓库里的 demo/nextjs/ 目录。

【免费下载链接】better-authThe most comprehensive authentication framework项目地址: https://gitcode.com/GitHub_Trending/be/better-auth

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 9:22:58

YOLO格式椰子成熟度检测数据集构建与模型训练全流程实战

简介&#xff1a;本资源是面向农业AI视觉检测领域的YOLO专用椰子成熟度数据集&#xff0c;适用于计算机视觉初学者、农业智能化研究者及YOLO系列模型&#xff08;如YOLOv5/v8&#xff09;实践者&#xff0c;解决真实场景下椰子果实成熟阶段精准识别问题。数据集共3271张高质量J…

作者头像 李华
网站建设 2026/9/3 9:21:14

数据分析零基础入门:从工具到业务思维的完整学习路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 9:21:10

音乐制作中的减法艺术:极简表演的技术实现与情感传达

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 9:20:54

JumpServer 集群部署指南:如何构建 99.9% 高可用架构

JumpServer 集群部署指南&#xff1a;如何构建 99.9% 高可用架构 【免费下载链接】jumpserver JumpServer is an open-source Privileged Access Management (PAM) platform that provides DevOps and IT teams with on-demand and secure access to SSH, RDP, Kubernetes, Dat…

作者头像 李华
网站建设 2026/9/3 9:20:23

昇腾950与大模型落地:从算力采购到NPU部署的工程实践指南

最近看到一条行业消息&#xff1a;范式智能拟出资超 10 亿元采购华为昇腾 950 芯片&#xff0c;用于大模型落地。这类大额算力采购&#xff0c;如果放到前两年&#xff0c;可能更多被视为“硬件新闻”&#xff1b;但在今天&#xff0c;它背后其实是一连串工程问题&#xff1a;大…

作者头像 李华
网站建设 2026/9/3 9:17:24

Solstice:Hive长跑任务智能治理平台,从监控到优化的闭环解决方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华