2014-02-13 116 views
1

我有一個通過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域的內部測試。這是一種幻覺;它實際上從來沒有。

有人告訴我,我需要使用服務帳戶來覆蓋域用戶。這似乎令我感到困惑,因爲我的程序沒有任何意義上的服務器,但我嘗試了它。而且我嘗試的方式並不奏效 - 但我不能肯定我做得對。有一些確認或否認使用服務帳戶是正確的策略將有極大的幫助。

回答

0

沒有看到你的代碼,我唯一的直覺是,你不初始客戶端響應發送完整的電子郵件地址:

https://developers.google.com/gmail/xoauth2_protocol#the_sasl_xoauth2_mechanism

等,表現出你的代碼可以幫助我們在看到問題。

+0

這聽起來也是個好主意,謝謝。不過,我已檢查並確認我正在發送完整的電子郵件地址。我會稍微捅一下,然後發佈一些代碼。 – Hieronymous

+0

順便說一句,我相信這是在 https://developers.google.com/gmail/xoauth2_protocol#the_sasl_xoauth2_mechanism 基於64位包括不應該有初始客戶端響應結束換行的錯誤。 – Hieronymous

+0

請參閱上面的說明base64,「經過base64編碼,這將成爲(爲了清晰插入換行符)」 –

0

很可能您需要檢查您的域帳戶中是否啓用了IMAP/POP;在我公司工作,他們通過限制安全原因此訪問權限,這裏是你應該如何啓用它:

啓用IMAP在Gmail設置

登錄到Gmail。 點擊右上角的齒輪。 選擇設置。 點擊轉發和POP/IMAP。 選擇啓用IMAP。 單擊保存更改。

Ref:https://support.google.com/mail/troubleshooter/1668960?hl=en#ts=1665018

+0

好主意,謝謝,但這不是問題。當IMAP未啓用時,Gmail足以發送IMAP回覆,表示登錄爲「[email protected]_」被拒絕:[ALERT]您的帳戶未啓用IMAP使用。請訪問您的Gmail設置頁面,並啓用您的帳戶以訪問IMAP。 (失敗) – Hieronymous

+0

看到代碼真的需要成爲下一步(即使它只是一個小樣本來演示問題)。僅供參考,我的項目GYB是開源的,支持Gmail IMAP OAuth 2.0身份驗證。它可以成功地與gmail.com和Google Apps帳戶配合使用:https://code.google.com/p/got-your-back/source/browse/trunk/gyb.py#179 –

+0

啊哈,我剛剛在看GYB。我會再看一眼,看看它是否顯示我缺少的東西。謝謝! – Hieronymous

相關問題