Vue.js+Java-SpringBoot集成Office 365 SSO及权限配置咨询
Office 365 SSO 接入 Vue + SpringBoot 全流程解答
1. SSO 是否仅需在 Vue.js 前端实现?
不行,必须前后端配合完成。前端只负责引导用户跳转到 Office 365 的认证页面、接收回调返回的令牌,但绝对不能只靠前端完成认证逻辑——前端的令牌很容易被伪造或篡改,后端必须参与验证令牌的合法性,才能确保登录请求的真实有效。
2. 认证成功后会返回什么内容?
Office 365 基于 OAuth2 + OpenID Connect 协议实现认证,成功后会返回两类核心令牌(均为 JWT 格式):
- ID Token:包含用户核心身份信息,比如用户邮箱
email、姓名name、唯一用户IDoid、租户IDtid、令牌签发方iss、受众aud(你的应用ID)、有效期exp等。这个令牌是身份验证的核心,解析后就能拿到用户的基本身份信息。 - Access Token:如果配置了对应权限,会返回此令牌,用于调用 Microsoft Graph API(比如获取用户更多信息)。但如果你的场景仅需登录验证,
User.Read权限下的 Access Token 不是必需的,核心用 ID Token 即可。 - 可选Refresh Token:用于在 Access Token 过期后,无需重新登录就能获取新令牌,适合长会话场景。
你可以在前端用jwt-decode库解析这些令牌,查看具体字段。
3. 如何配置应用权限?
所有配置操作都在 Azure AD 门户完成:
- 登录 Azure 门户,进入Azure Active Directory → 应用注册,点击新注册。
- 填写应用名称,选择支持的账户类型(比如“仅此组织目录中的账户”适用于企业内部应用,“任何组织目录中的账户”则面向外部租户),设置重定向URI——填你的 Vue 应用回调地址,例如
http://localhost:8080/auth/callback。 - 注册完成后,记录客户端ID和租户ID,前端和后端都会用到这两个参数。
- 进入API权限 → 添加权限,选择Microsoft Graph → 委派权限,搜索并添加
User.Read权限(该权限仅用于获取用户基本信息,完全满足你的登录场景)。 - 若为企业租户应用,需点击授予管理员同意(否则每个用户登录时都要手动授权)。
- 在认证模块中配置令牌类型,确保系统会返回 ID Token。
注意:因为你的应用自行管控权限,所以不需要添加应用权限(这类权限用于后端服务无需用户参与的API调用场景),仅需委派权限即可。
4. 是否需要后端操作来确保认证有效性?
必须要,后端的核心作用就是校验令牌合法性,具体要做这些事:
- 验证 ID Token 签名:确保令牌由微软官方签发,未被篡改。可以使用微软的 MSAL4J 库(Java 版)自动完成签名、签发方、有效期等校验。
- 校验令牌核心字段:确认
aud(受众)是你的应用客户端ID,iss(签发方)符合 Office 365 的地址格式(比如https://login.microsoftonline.com/租户ID/v2.0),exp(有效期)未过期。 - 关联本地用户权限:解析 ID Token 拿到用户邮箱或
oid后,去自有数据库查询该用户的权限(比如角色、可访问功能),然后生成应用自身的会话令牌(比如自定义 JWT)返回给前端,后续前端请求接口时使用此令牌,而非直接用 Office 365 的令牌。 - 接口权限校验:后端每个需要权限控制的接口,都要验证前端传来的会话令牌,确认用户权限符合要求。
举个简单的 Java 代码示例(用 MSAL4J 验证 ID Token):
// 初始化验证器 PublicClientApplication pca = PublicClientApplication.builder(CLIENT_ID) .authority(AUTHORITY) // 格式:https://login.microsoftonline.com/租户ID/v2.0 .build(); // 验证ID Token ValidationResult result = pca.validateIdToken(idToken); if (result.getValidationSucceeded()) { // 令牌合法,解析用户信息 IAuthenticationResult authResult = result.getAuthenticationResult(); String userEmail = authResult.account().username(); // 去数据库查询用户权限逻辑 } else { // 令牌非法,拒绝登录 throw new SecurityException("Invalid ID Token"); }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

