Excel上使用VBA的WebBrowser控件实现单点登录(SSO)

需求

Excel 上可以做出很多漂亮的报表, 产品经理希望能够在Excel上弹出登录页面,实现单点登录,
登录完成后,从服务器端取回模板列表,选择其中一个模板,插入到Excel中。

设计

  1. 登录界面可用前端技术实现,比如Angular与VUE
  2. VBA中自带的WebBrowser控件可以作为加载Web登录页面的“壳”。
  3. VBA不断尝试获取页面上的cookie,直到取到cookie,并且cookie中包含token。
  4. 使用URLDecode解码cookie,获取token。
  5. 使用该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

注意

  1. 由于VBA的WebBrowser是IE内核,而微软官方已经宣布放弃支持IE,因此随着Angular、VUE等版本的升级,可能会出现WebBrowser无法正常加载网页的情况,需要多做测试。
  2. 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
原文地址:https://www.cnblogs.com/xiaxianfei/p/15712727.html