Google APIs Client Library for .NETの解説ページで、Service accountのサンプルプログラムが掲載されている。しかし、このコード、環境によってはエラーが発生してしまう。
指定されたパスが見つかりません。
場所 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
場所 System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
場所 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
場所 System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
場所 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
場所 Loki.googleAdminReportMVC.usageReportService.<Run>d__e.MoveNext() 場所 e:\Loki\Loki.googleAdminReportMVC\usageReportService.cs:行 22
英語だと「The certificate file does not exist.」、日本語だと「指定されたパスが見つかりません。」と言われてしまう。
問題のコードは次のようなコード。
var certificate = new X509Certificate2(@"~/key.p12", "notasecret", X509KeyStorageFlags.Exportable); ServiceAccountCredential credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = new[] { ReportsService.Scope.AdminReportsUsageReadonly }, }.FromCertificate(certificate));
間違いなくファイルもあるのだけど、無いと言われる。
仕方が無いので次のように、「HostingEnvironment.MapPath」を使うように書き換えたら、エラーが出なくなった。
ちなみに、上記コードだと、まだ認証が通らないので、プロパティを一つ追加している。
var certificate = new X509Certificate2(HostingEnvironment.MapPath(@"~/key.p12"), "notasecret", X509KeyStorageFlags.Exportable); ServiceAccountCredential credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = new[] { ReportsService.Scope.AdminReportsUsageReadonly }, User = "hoge@example.com" }.FromCertificate(certificate));