对于身份验证,我们使用文档中提到的以下范围 https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth
离线访问 https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send 我们能够成功获取access_token和refresh_token
我们想要获取 userPrincipalName 但 https://outlook.office.com/api/v2.0/me/ api 不返回 userPrincipalName。 我们尝试使用 graph api https://graph.microsoft.com/v1.0/me 来获取 userPrincipalName 但是我们收到错误,看起来只有图形范围才能命中图形 api。
我们尝试使用图形范围 url,
https://graph.microsoft.com/IMAP.AccessAsUser.All,https://graph.microsoft.com/SMTP.Send 并且能够访问 graph api ,但是 smtp 和 imap 身份验证不适用于这些范围。
由于 Microsoft 正在弃用 Outlook Rest api 并要求转向图形 api 那么为什么 SMTP 和 IMAP 不支持图形范围 url?
有什么方法可以获取 userPricipalName 吗?
你说得完全正确。这浪费了我一整夜的时间。
请求 Microsoft oAuth2 Outlook IMAP/SMTP/POP 访问令牌时,您必须提供范围,例如:
offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send
您不能将
https://outlook.office.com
范围与任何其他类型的范围混合,否则在尝试 oAuth2 到 IMAP 或 SMTP 时 AUTH 将失败 - 即使令牌看起来完全有效。
提取电子邮件地址的答案是:
' Get the Header, Payload and Signature of the token
' Header & Payload are Base64 encoded strings - add missing padding
Dim jwtH As String = Encoding.UTF8.GetString(Convert.FromBase64String(AddMissingBase64Padding(Token.Split(".")(0))))
Dim jwtP As String = Encoding.UTF8.GetString(Convert.FromBase64String(AddMissingBase64Padding(Token.Split(".")(1))))
Dim jwtS As String = Result.Token.Split(".")(2)
' Now extract the Email Address
Dim Username As String = JsonConvert.DeserializeObject(jwtP)("upn").value
Private Function AddMissingBase64Padding(Base64String As String) As String
' Calculate the number of padding characters needed
Return Base64String & Left("===", Base64String.Length Mod 4)
End Function