7

MVC Web サイトで Google アナリティクス API を使用したいのですが、API サービス アカウントを使用して認証を行い、oauth2 でローカルホストに問題はありませんが、Azure にデプロイするとすぐに 502 エラーが発生します。

「502 - Web サーバーは、ゲートウェイまたはプロキシ サーバーとして機能しているときに無効な応答を受け取りました。お探しのページに問題があり、表示できません。(ゲートウェイまたはプロキシとして機能しているときに) Web サーバーが接続したときコンテンツ サーバーから無効な応答を受け取りました。」

ここに私のコードがあります:

const string ServiceAccountUser = "xxxxxxxxxx-cpla4j8focrebami0l87mbcto09j9j6k@developer.gserviceaccount.com";
AssertionFlowClient client = new AssertionFlowClient(
        GoogleAuthenticationServer.Description,
            new X509Certificate2(System.Web.Hosting.HostingEnvironment.MapPath("/Areas/Admin/xxxxxxxxxxxxxxxxxx-privatekey.p12"), 
                "notasecret", X509KeyStorageFlags.Exportable))
        {
            Scope = AnalyticsService.Scopes.AnalyticsReadonly.GetStringValue(),
            ServiceAccountId = ServiceAccountUser //Bug, why does ServiceAccountUser have to be assigned to ServiceAccountId
            //,ServiceAccountUser = ServiceAccountUser
        };
        OAuth2Authenticator<AssertionFlowClient> authenticator = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);

何が原因かわかりませんか?Azure 内に何か不足していますか?

助けてくれてありがとう。

4

2 に答える 2

9

このまったく同じ問題に何時間も苦労した後、さまざまな情報源をつなぎ合わせることで回避策を見つけました。

この問題は、Azure Web サイトから p12 ファイルを読み込もうとすると発生します。つまり、コードのこの行が失敗します。

var key = new X509Certificate2(keyFile, keyPassword, X509KeyStorageFlags.Exportable);

理由はわかりませんが、ファイルを cer と key.xml ファイルに分割すると機能しますか?

まず、これらのファイルを抽出します (コンソール アプリを使用しました)。

// load pfx/p12 as "exportable"
var p12Cert = new X509Certificate2(@"c:\Temp\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable);

// export .cer from .pfx/.p12
File.WriteAllBytes(@"C:\Temp\MyCert.cer", p12Cert.Export(X509ContentType.Cert));

// export private key XML
string privateKeyXml = p12Cert.PrivateKey.ToXmlString(true);

File.WriteAllText(@"C:\Temp\PrivateKey.xml", privateKeyXml);

次に、それらをWebサイトにコピーして、そのようにロードします

//Store the authentication description
AuthorizationServerDescription desc = GoogleAuthenticationServer.Description;

//Create a certificate object to use when authenticating

var rsaCryptoServiceProvider = new RSACryptoServiceProvider();
rsaCryptoServiceProvider.FromXmlString(File.ReadAllText(keyFile));
var key = new X509Certificate2(certFile) {PrivateKey = rsaCryptoServiceProvider};


//Now, we will log in and authenticate, passing in the description
//and key from above, then setting the accountId and scope
var client = new AssertionFlowClient(desc, key)
{
    //cliendId is your SERVICE ACCOUNT Email Address from Google APIs Console
    //looks something like 12345-randomstring@developer.gserviceaccount.com
    //~IMPORTANT~: this email address has to be added to your Google Analytics profile
    // and given Read & Analyze permissions
    ServiceAccountId = clientId,
    Scope = "https://www.googleapis.com/auth/analytics.readonly"
};

//Finally, complete the authentication process
//NOTE: This is the first change from the update above
var auth = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState);

//First, create a new service object
//NOTE: this is the second change from the update
//above. Thanks to James for pointing this out
var gas = new AnalyticsService(new BaseClientService.Initializer { Authenticator = auth });

これでうまくいきました。お役に立てば幸いです。

于 2013-06-10T04:23:54.223 に答える