如何在Excel VBA中实现Microsoft单点登录功能?
可行性结论
完全可以通过现有SOAP API兼容实现微软单点登录需求,无需重构现有接口调用逻辑,仅需修改认证凭证生成部分即可。
核心实现逻辑
你当前使用的Oracle Fusion PublicReportService SOAP接口本身支持OAuth 2.0令牌认证,微软单点登录本质是通过Azure AD发放符合Oracle Fusion信任规则的访问令牌,替换原有基础认证的凭证即可:
- 前置配置需要企业IT管理员在Azure AD中完成两个注册操作:将Oracle Fusion配置为支持SSO的企业应用,同时将你的Excel VBA程序注册为公开客户端,授予其访问Oracle Fusion API的权限
- 原有请求逻辑保持不变,仅需要把原来的
Authorization: Basic <Base64编码的用户名密码>请求头,替换为Authorization: Bearer <Azure AD发放的访问令牌>即可
代码修改示例
第一步:新增获取Azure AD访问令牌的VBA函数
Function GetAzureADAccessToken() As String Dim xmlhtp As New MSXML2.XMLHTTP60 Dim tenantId As String, clientId As String, scope As String Dim requestBody As String ' 以下参数由IT管理员配置后提供 tenantId = "你的Azure AD租户ID" clientId = "注册的Excel客户端应用ID" scope = "Oracle Fusion应用的API权限范围" requestBody = "grant_type=authorization_code" & _ "&client_id=" & clientId & _ "&scope=" & scope & _ "&code=<用户登录后获取到的授权码>" ' 授权码通过系统默认浏览器跳转登录后捕获 With xmlhtp .Open "POST", "https://login.microsoftonline.com/" & tenantId & "/oauth2/v2.0/token", False .SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" .Send requestBody ' 解析返回JSON获取access_token,可引入VBA-JSON库解析,此处省略解析逻辑 GetAzureADAccessToken = "解析得到的访问令牌" End With End Function
第二步:修改原有认证逻辑
将原有代码中设置基础认证头的行:
.SetRequestHeader "Authorization", "Basic " & Base64.EncodeTextBase64(username + ":" + password)
替换为SSO令牌认证:
.SetRequestHeader "Authorization", "Bearer " & GetAzureADAccessToken()
注意事项
- 桌面端VBA场景推荐使用OAuth 2.0授权码流实现登录,避免直接处理用户密码,符合企业安全规范
- 访问令牌有固定有效期,可新增本地缓存逻辑,过期后再重新获取,无需每次调用接口都触发登录流程
- 若企业采用SAML协议的SSO方案,也可通过获取SAML断言后转换为Oracle Fusion接受的认证头实现,逻辑和OAuth方案类似
内容的提问来源于stack exchange,提问作者Nirbhay
相关产品推荐
相关产品推荐

