【解決方法】アカウント選択画面を使用しないように oauth を使用するにはどうすればよいですか (office365/exchange メール送信)

プログラミングQA


やあ、

したがって、ブラウザ内で使用するアカウントを手動で選択すると、Oauth 認証の肯定的な結果が得られますが、アカウントを選択したくないため、アクセスしようとしているアカウントを利用するには Oauth が必要です。

Dim L as String =”theloginemailaddress”
PW を string=”thepassword” として薄暗い
明らかに、L と PW には通常、実際の情報が入力されています。

Using client As HttpClient = New HttpClient()
               Dim request = New FormUrlEncodedContent(New Dictionary(Of String, String) From {
                   {"grant_type", "password"},
                   {"client_id", SMTPOAUTH2_CLIENT_ID},
                   {"client_secret", SMTPOAUTH2_CLIENT_SECRET},
                   {"username", L},
                   {"scope", "Mail.Write"},
           {"Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{L}:{PW}"))}
                   })
               request.Headers.Add("X-PrettyPrint", "1")

               Dim response = client.PostAsync(SMTPOAUTH2_AUTHORENDPOINT, request).Result
               jsonResponse = response.Content.ReadAsStringAsync().Result

返された json 応答は、複数の Outlook アカウントを持っているため、アカウント選択ページです。 おそらく、これをバイパスしてアカウントに直接送られる、渡すことができるパラメーターだと思います。 余分なパラメーターが何であるかを誰かが知っていれば、私は最も感謝しています。探している情報が見つからないか、情報を見つける際に間違った用語を使用している可能性があります。

私が試したこと:

上記のコードに従って、追加してみました

{"Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{L}:{PW}"))}

これは何もしていないように見えます (そしておそらく間違っています) Web ページから持ち上げたものですが、必要なアカウントに移動することができず、単なるパラメーターの変更である可能性があります-私は推測しています.

解決策 1

車輪を再発明するのではなく、Microsoft Authentication Library を使用して OAuth2 トークンを取得します。
MSAL について学ぶ – Microsoft Entra | マイクロソフト ラーン[^]

この場合、「ユーザー名/パスワード (ROPC)」フローを使用するようです。
Microsoft Authentication Library (MSAL) での認証フローのサポート – Microsoft Entra | マイクロソフト ラーン[^]

注意: このフローは実際には「安全」とは見なされません。 通常は、クライアント資格情報フローを選択することをお勧めします。

トークンを取得したら、認証に OAuth2 トークンを使用した SASL の使用をサポートする SMTP ライブラリが必要になります。 Microsoft の推奨ライブラリは MailKit です。
GitHub – jstedfast/MailKit: IMAP、POP3、および SMTP 用のクロスプラットフォーム .NET ライブラリ。[^]

解決策 2

リチャードのおかげで、彼のコードを検索して、ブラウザを使用せずに必要なものを見つけることができました。AuthToken を取得するには、値を独自のものに置き換えて、AuthToken 文字列をメール コンポーネントに渡し、OAuth2 を使用してメールを送信します。

Public Function GetAccessToken() As String
    Dim tenantId = "aa9....."
    Dim clientId = "1fb...."
    Dim authorityUri As String = "https://login.microsoftonline.com/........./oauth2/v2.0/authorize"
    Dim redirectUri = "http://localhost:3017"
    Dim scopes = New List(Of String) From {
        "put your scope in here"
    }
    Dim clientSecret = "bUn....."
    Dim confidentialClient = ConfidentialClientApplicationBuilder.Create(clientId).WithClientSecret(clientSecret).WithAuthority(New Uri(authorityUri)).WithRedirectUri(redirectUri).Build()
    Dim accessTokenRequest = confidentialClient.AcquireTokenForClient(scopes)
    Dim accessToken = accessTokenRequest.ExecuteAsync().Result.AccessToken
    Return accessToken
End Function

コメント

タイトルとURLをコピーしました