2013-04-05 120 views
1

是否可以使用AssertionFlowClient和服務帳戶通過IMAP訪問我的域中的任何用戶的郵箱。與雙腿OAuth 1.0相同。使用AssertionFlowClient和服務帳戶訪問Gmail的IMAP

這裏是我的代碼:

X509Certificate2 certificate = new X509Certificate2(...) 
AuthorizationServerDescription server = new AuthorizationServerDescription {...}; 
List<string> scope = new List<string> { 
    "https://mail.google.com/", 
    "https://www.googleapis.com/auth/userinfo#email" }; 

AssertionFlowClient provider = new AssertionFlowClient(server, certificate) 
{ 
    ServiceAccountId = SERVICE_ACCOUNT_EMAIL, 
    Scope = string.Join(" ",scope.ToArray()), 
}; 

IAuthorizationState grantedAccess = AssertionFlowClient.GetState(provider); 
accessToken = grantedAccess.AccessToken; 

using (Imap client = new Imap()) 
{ 
    client.ConnectSSL("imap.gmail.com"); 
    client.LoginOAUTH2("[email protected]", accessToken); 
    ... 
} 

我能夠從accounts.google.com服務器檢索有效的accessToken(雖然AssertionFlowClient/DotNetOpenAuth有一個bug,目前我使用調試器,監視窗口進行檢索) 。

我敢肯定的accessToken是正確的,我可以用它查詢www.googleapis.com/userinfo/email API終點 - 它返回的值相同SERVICE_ACCOUNT_EMAIL。

Gmail的IMAP服務器返回以下錯誤但是:

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"} 

「管理API客戶端訪問」 此服務帳戶被配置爲上的cPanel 「郵件(讀/寫/發送)https://mail.google.com/」。

AssertionFlowClient/DotNetOpenAuth bug表示沒有人嘗試過這種方式。

有沒有可能?

回答

1

因此,似乎谷歌忘了,包括他們的文檔在這個小細節:

AssertionFlowClient provider = new AssertionFlowClient(server, certificate) 
    { 
     ServiceAccountId = SERVICE_ACCOUNT_EMAIL, 
     Scope = "https://mail.google.com/", 
     ServiceAccountUser = "[email protected]", // <- important 
    }; 

看來還請求訪問多個範圍(用空格隔開)失敗。

相關問題