Warum das Thema plötzlich heiß ist

Früher hast Du Benutzername und Passwort direkt geprüft.
Heute? Geht nicht mehr so einfach.
Microsoft 365 (bzw. Azure AD) blockt Basic Auth und klassische Anmeldewege zunehmend ab.

Wenn Du mit VBA auf M365-Dienste (z. B. Outlook, OneDrive, SharePoint, Graph API) zugreifen willst, brauchst Du OAuth2.
Und einen cleveren Login-Flow.

Was Du brauchst

  • Einen registrierten App-Client in Azure AD
  • Redirect-URL (z. B. http://localhost)
  • VBA mit Zugriff auf WinHttp.WinHttpRequest.5.1 oder MSXML2.XMLHTTP
  • Optional: Webbrowser-Steuerung für den Login

Schritt 1: App in Azure AD registrieren

Im Azure-Portal:

  • App registrieren unter Azure Active Directory → App-Registrierungen
  • Redirect-URI auf „http://localhost“ setzen
  • Relevante Berechtigungen (z. B. User.Read, Mail.Read, Files.Read) zuweisen
  • Client-ID notieren

Multi-Tenant oder nur für die eigene Organisation – je nach Use Case.

Schritt 2: Login über Systembrowser erzwingen

Du schickst den Benutzer zum Login per Link – im Defaultbrowser.

Sub StarteLogin()
    Dim clientId As String
    Dim redirectUri As String
    Dim scope As String
    Dim authUrl As String

    clientId = "deine-client-id"
    redirectUri = "http://localhost"
    scope = "https%3A%2F%2Fgraph.microsoft.com%2FUser.Read"

    authUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?" & _
              "client_id=" & clientId & _
              "&response_type=code" & _
              "&redirect_uri=" & redirectUri & _
              "&response_mode=query" & _
              "&scope=" & scope & _
              "&state=12345"

    Shell "cmd /c start " & authUrl, vbHide
End Sub

Der Benutzer meldet sich an. Microsoft leitet um auf http://localhost/?code=...

Jetzt brauchst Du einen lokalen Listener. Nicht trivial in VBA. Aber möglich.

Schritt 3: Code per lokalen Listener abfangen (VBA & Winsock)

Du baust Dir einen Mini-HTTP-Listener mit Winsock oder mit einer externen kleinen EXE, die Du ansteuerst.
Alternativ: Du machst das über eine temporäre UserForm mit Webbrowser-Steuerelement (weniger elegant, aber geht).

' Diese Lösung nutzt die Webbrowser-Control und filtert den Redirect
Private WithEvents Web As Object

Sub StarteLoginMitWebForm()
    Set Web = UserForm1.WebBrowser1
    UserForm1.Show
    Web.Navigate authUrl
End Sub

Private Sub Web_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    If InStr(URL, "http://localhost/?code=") > 0 Then
        ' Token auslesen
        MsgBox "Code empfangen: " & URL
        ' Jetzt folgt Token-Anforderung
    End If
End Sub

Nicht schön. Aber funktioniert.

Schritt 4: Access Token mit POST holen

Function HoleAccessToken(authCode As String) As String
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")

    Dim clientId As String
    Dim redirectUri As String
    Dim clientSecret As String ' Optional, je nach Flow

    clientId = "deine-client-id"
    redirectUri = "http://localhost"

    Dim postData As String
    postData = "client_id=" & clientId & _
               "&scope=https%3A%2F%2Fgraph.microsoft.com%2FUser.Read" & _
               "&code=" & authCode & _
               "&redirect_uri=" & redirectUri & _
               "&grant_type=authorization_code"

    http.Open "POST", "https://login.microsoftonline.com/common/oauth2/v2.0/token", False
    http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    http.Send postData

    HoleAccessToken = http.responseText
End Function

Du bekommst ein JSON mit AccessToken und RefreshToken.

Schritt 5: Zugriff auf Graph API per VBA

Function HoleBenutzerdaten(accessToken As String) As String
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")

    http.Open "GET", "https://graph.microsoft.com/v1.0/me", False
    http.setRequestHeader "Authorization", "Bearer " & accessToken
    http.Send

    HoleBenutzerdaten = http.responseText
End Function

Du bekommst JSON zurück – parsen per JsonConverter oder eigenem Parser.

Token zwischenspeichern

Access Token ist nur kurz gültig. Refresh Token hält länger.

Du kannst die Tokens verschlüsselt in einer Tabelle oder Registry ablegen.

Dann musst Du nicht jedes Mal neu einloggen.

Tabelle: Was Du brauchst je nach Flow

AnforderungLösung
Einfache AnmeldungAuthorization Code Flow
Ohne User-InteraktionClient Credentials Flow
Access in Outlook/GraphMS Graph + OAuth2
Token-HandlingJSON parsen + speichern

Trockener Tipp zum Schluss

Wenn Du versuchst, OAuth2 wie ein klassisches Login zu behandeln – scheiterst Du.

Bau lieber eine OAuth-Schicht außenrum.
Dann kannst Du Deine alte Logik weiter nutzen – mit modernem Login.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert