我有一個通過IMAP訪問Gmail的C#安裝應用程序。使用傳統的IMAP身份驗證,對於單個Gmail用戶和Google Apps用戶都可以很好地工作。對Gmail的OAuth 2.0身份驗證適用於使用gmail.com域名但不適用於Google Apps域的帳戶
我現在已經使用Google的.Net API添加了對OAuth 2.0身份驗證的支持。對於普通的Gmail帳戶(例如[email protected]),此功能非常合適,但對於具有不同域的Google Apps帳戶則無效。系統提示用戶通過網絡瀏覽器登錄並接受訪問,但隨後IMAP身份驗證嘗試失敗,並顯示「無效憑據」。 Google Apps域需要以不同的方式完成嗎?
正如我在下面的評論中首次報道的那樣,我對此做了一個小的突破。最初,我用用戶參數的字面字符串「user」調用GoogleWebAuthorizationBroker.AuthorizeAsync()(因爲這是我在許多示例中看到的)。這適用於普通的Gmail用戶,但我發現,對於Google Apps,必須傳遞授權用戶的實際電子郵件地址。
有一段時間我以爲這是問題的整體解決方案。但事實證明不是。麻煩的是,它現在可以在內部測試中完美運行,但在我們所擁有的一個測試版網站中,它會以同樣的舊方式常規失敗。我只能想到失敗的四個可能原因:(1)程序獲取無效的訪問令牌,(2)它以某種方式破壞該令牌,(3)錯誤地進行XOAUTH驗證或(4)使用令牌來驗證令牌不適用的帳戶。我認爲谷歌不太可能提供無效令牌,因此(1)可以大打折扣。 (2)和(3)總是可能的,但代碼適用於我們自己的幾個Gmail和Google Apps帳戶的事實使其看起來不太可能。客戶堅持認爲(4)並非如此。所以我仍然感到困惑。
有人建議,我發佈了一些代碼,現在我準備好了。下面是執行身份驗證的C#函數的開始:
private void AuthenticateXOAuth2(string strUsername, string strAccessToken)
{
uint uStatus = 0;
// The SASL XOAUTH2 initial client response has the following format:
//
// base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A")
string strInitialClientResponse = "user=" + strUsername + "\x1" + "auth=Bearer " + strAccessToken + "\x1\x1";
byte[] vbInitialClientResponse = Encoding.UTF8.GetBytes(strInitialClientResponse);
string strBase64InitialClientResponse = System.Convert.ToBase64String(vbInitialClientResponse);
string strCommand = "AUTHENTICATE XOAUTH2 " + strBase64InitialClientResponse;
SendCommand(strCommand);
...
我仍然爲此而努力,往上走死衚衕,並獲得更加沮喪。我必須糾正之前說過的一件事:我聲稱該計劃適用於Google Apps域的內部測試。這是一種幻覺;它實際上從來沒有。
有人告訴我,我需要使用服務帳戶來覆蓋域用戶。這似乎令我感到困惑,因爲我的程序沒有任何意義上的服務器,但我嘗試了它。而且我嘗試的方式並不奏效 - 但我不能肯定我做得對。有一些確認或否認使用服務帳戶是正確的策略將有極大的幫助。
這聽起來也是個好主意,謝謝。不過,我已檢查並確認我正在發送完整的電子郵件地址。我會稍微捅一下,然後發佈一些代碼。 – Hieronymous
順便說一句,我相信這是在 https://developers.google.com/gmail/xoauth2_protocol#the_sasl_xoauth2_mechanism 基於64位包括不應該有初始客戶端響應結束換行的錯誤。 – Hieronymous
請參閱上面的說明base64,「經過base64編碼,這將成爲(爲了清晰插入換行符)」 –