1

AssertionFlowClient とサービス アカウントを使用して、IMAP 経由でドメイン内の任意のユーザーのメールボックスにアクセスできますか? 2-legged OAuth 1.0 と同じです。

これが私のコードです:

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("user@mydomain.com", accessToken);
    ...
}

accounts.google.com サーバーから有効な accessToken を取得できます (ただし、AssertionFlowClient/DotNetOpenAuth にはバグがあり、現在はデバッガーとウォッチ ウィンドウを使用して取得しています)。

accessToken を使用して www.googleapis.com/userinfo/email API エンドポイントをクエリできるため、 accessToken は正しいと確信しています。SERVICE_ACCOUNT_EMAIL と同じ値が返されます。

ただし、Gmail の IMAP サーバーは次のエラーを返します。

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

このサービス アカウントの [API クライアント アクセスの管理] は、cpanel で[メール (読み取り/書き込み/送信) https://mail.google.com/ ] に設定されています。

AssertionFlowClient/DotNetOpenAuth バグは、誰もこれを試したことがないことを示しています。

それはまったく可能ですか?

4

1 に答える 1

1

そのため、Google はドキュメントにこの小さな詳細を含めるのを忘れていたようです。

AssertionFlowClient provider = new AssertionFlowClient(server, certificate)
    {
        ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
        Scope = "https://mail.google.com/",
        ServiceAccountUser = "user@mydomain.com",  // <- important
    };

また、複数のスコープ (スペース区切り) へのアクセスを要求すると失敗するようです。

于 2013-04-06T13:42:43.260 に答える