Excel上使用VBA的WebBrowser控件实现单点登录(SSO)
需求
Excel 上可以做出很多漂亮的报表, 产品经理希望能够在Excel上弹出登录页面,实现单点登录,
登录完成后,从服务器端取回模板列表,选择其中一个模板,插入到Excel中。
设计
- 登录界面可用前端技术实现,比如Angular与VUE
- VBA中自带的WebBrowser控件可以作为加载Web登录页面的“壳”。
- VBA不断尝试获取页面上的cookie,直到取到cookie,并且cookie中包含token。
- 使用URLDecode解码cookie,获取token。
- 使用该token发出rest api请求获取模板列表。
部分实现
从WebBrowser获取cookie
Public Function GetCookieFromBrowser(serverIP As String)
Dim url As String
Dim encodedCookie As String
encodedCookie = ""
url = "https://" + serverIP + "/test/login/" + "?refresh=" + Guid()
FLoginWeb.FWebBrowser.Silent = True
FLoginWeb.FWebBrowser.Navigate url
FLoginWeb.Show vbModeless
Do Until InStr(FLoginWeb.FWebBrowser.Document.cookie, "token") > 0: DoEvents: Loop
If FLoginWeb.FWebBrowser.Document.cookie <> "" Then
encodedCookie = FLoginWeb.FWebBrowser.Document.cookie
FLoginWeb.Hide
End If
GetEncodedCookieFromWebBrowser = encodedCookie
End Function
注意
- 由于VBA的WebBrowser是IE内核,而微软官方已经宣布放弃支持IE,因此随着Angular、VUE等版本的升级,可能会出现WebBrowser无法正常加载网页的情况,需要多做测试。
- WebBrowser默认使用的版本是IE7的兼容模式,为了得到更好的体验,可以修改注册表改为支持IE11,方法如下:
Public Sub SetWebBrowserIE11()
Dim fso
Dim RegKey_User_IE As String
Dim oWshell
Dim excelKey As String
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
RegKey_User_IE = "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\excel.exe"
Set oWshell = CreateObject("WScript.Shell")
excelKey = oWshell.RegRead(RegKey_User_IE)
If excelKey = "" Then
oWshell.RegWrite RegKey_User_IE, "11000", "REG_DWORD"
End If
Set oWshell = Nothing
End Sub