如何使用Azure Active Directory实现PHP应用的SSO单点登录认证
Azure AD SSO 前端接入实操指南
前置准备
首先找学校的Azure AD管理员确认以下信息:
- 已在Azure AD中注册好的应用核心参数:客户端ID(
clientId)、租户ID(tenantId) - 重定向URI白名单:本地开发需要添加
http://localhost:对应端口号,生产环境要和你前端部署的域名完全匹配 - 应用平台类型必须设置为单页应用(SPA),不要选择Web应用,否则会出现跨域、授权码校验失败等问题
接入步骤
1. 选择认证库
微软官方推荐使用MSAL.js库实现认证,不要使用已停止维护的ADAL.js:
- 原生JS/无框架场景:使用
@azure/msal-browserv2及以上版本 - 框架场景直接使用对应封装包:React用
@azure/msal-react、Vue用@azure/msal-vue、Angular用@azure/msal-angular
2. 基础配置示例
以原生JS场景为例,首先安装依赖:npm install @azure/msal-browser
初始化MSAL实例:
import { PublicClientApplication } from "@azure/msal-browser"; const msalConfig = { auth: { clientId: "替换为你们的客户端ID", authority: "https://login.microsoftonline.com/替换为你们的租户ID", redirectUri: window.location.origin // 必须和注册的重定向URI完全一致 }, cache: { cacheLocation: "sessionStorage", // 需要持久化登录态可以改为localStorage storeAuthStateInCookie: false // 仅需要兼容IE时开启 } }; const msalInstance = new PublicClientApplication(msalConfig);
3. 实现登录逻辑
两种登录方式按需选择:
- 弹窗登录:调用
msalInstance.loginPopup(),适合PC端场景,不会打断当前页面状态 - 重定向登录:调用
msalInstance.loginRedirect(),适合移动端/弹窗易被拦截的场景,登录成功后需要调用msalInstance.handleRedirectPromise()处理回调结果
4. 获取访问令牌
登录成功后通过以下方法获取调用后端API所需的access token:
const tokenRequest = { scopes: ["User.Read"] // 替换为你们应用实际需要的权限scope,比如后端API暴露的自定义权限 }; async function getAccessToken() { const currentAccount = msalInstance.getAllAccounts()[0]; if (!currentAccount) throw new Error("用户未登录"); try { // 优先静默获取token,无需用户交互 const tokenRes = await msalInstance.acquireTokenSilent({ ...tokenRequest, account: currentAccount }); return tokenRes.accessToken; } catch (err) { // 静默获取失败时触发交互获取 if (err.name === "InteractionRequiredAuthError") { const tokenRes = await msalInstance.acquireTokenPopup(tokenRequest); return tokenRes.accessToken; } throw err; } }
5. 路由与权限控制
单页应用可以给需要登录的路由添加守卫:进入路由前判断msalInstance.getAllAccounts()是否有有效账号,无账号则跳转到登录逻辑。
6. 登出逻辑
调用msalInstance.logout()即可自动清空本地认证缓存,跳转至Azure AD统一登出页。
注意事项
- 前端属于公开客户端,不要在代码中硬编码任何客户端密钥,单页应用接入不需要密钥,泄露会有安全风险
- 权限scope按需申请,不要申请不必要的高权限
- 上线前务必确认生产环境域名已经添加到Azure AD应用的重定向URI白名单中
内容的提问来源于stack exchange,提问作者SSubedi
相关产品推荐
相关产品推荐

