Api Google Analytics в Azure
Я хочу использовать api Google analytics на своем веб-сайте MVC, im аутентификация с использованием учетной записи службы api и oauth2 без проблем на моем localhost, но как только я развертываюсь в Azure, я получаю ошибку 502:
"502 - веб-сервер получил недопустимый ответ, действуя в качестве шлюз или прокси-сервер. Есть проблема со страницей, на которой вы находитесь ищете, и его нельзя отобразить. Когда веб-сервер (в то время как действуя как шлюз или прокси-сервер) связался с сервер содержимого вверх , он получил неверный ответ от сервера содержимого."
heres мой код:
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?
Спасибо за любую помощь.
2 ответов
после нескольких часов боли по этой же самой проблеме я нашел работу, собирая вместе различные источники информации.
проблема возникает при попытке прочитать файл p12 с веб-сайта Azure, т. е. эта строка в моем коде не выполняется
var key = new X509Certificate2(keyFile, keyPassword, X509KeyStorageFlags.Exportable);
не знаю почему, но это работает, если вы разделите файл на cer и ключ.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);
затем скопируйте их на свой веб-сайт, а затем загрузите им так нравится
//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 });
Теперь это работает для меня, и я надеюсь, что это поможет вам.
Я также столкнулся с той же проблемой, но прошел X509KeyStorageFlags.MachineKeySet
в конструктор также исправлена проблема для меня.
X509Certificate2 certificate = new X509Certificate2(file, "key", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);