Jak mogę zalogować się do usługi Microsoft Live (z aplikacją .NET WebClient?) I zautomatyzować proces OAuth, aby uzyskać token do wywoływania funkcji API Bing Ads?Automatyzacja OAuth Bing Ads przy użyciu tylko .NET?
Moje pytanie jest podobne do How do I get an OAuth request_token from live.com?. Jednak buduję (C#, .NET 4.5.2) bezgłową usługę Windows, korzystając z kontekstu superużytkownika Bing Ads, które jest połączone z wieloma innymi kontami Bing Ads. Pomysł polega na uwierzytelnianiu, uzyskiwaniu automatycznych bitów, a następnie nawiązywaniu połączeń za pomocą bitów o 3:00 rano. Niektóre konta "konkurują", więc np. Grupa A nie powinna widzieć danych z grupy B, więc posiadanie aplikacji dla wszystkich danych, filtrowanie jej i dystrybucja z dnia na dzień rozwiązuje wiele problemów biznesowych.
Obawiam się, że jeśli Live przeżyją problemy lub nasza aplikacja zostanie wyłączona na dłuższy czas z dowolnego powodu, będziemy musieli ponownie uwierzytelnić się ręcznie, aby odzyskać dane. Utrzymanie i zarządzanie danymi uwierzytelniającymi jest teraz dodatkowym obciążeniem (dotyczy to środowiska korporacyjnego), które będzie musiało przybrać formę strony internetowej/strony intranetowej, aby umożliwić młodym/niewtajemniczonym pracę w razie potrzeby (nie zapomnij o testowaniu i dokumentacja). Dla kontrastu Google oferuje opcję użycia par kluczy dla grup, które muszą pracować w pełni zautomatyzowany sposób. Wygląda na to, że implementacja OAuth2 na Twitterze może być zautomatyzowana bez logowania GUI. Wygląda na to, że inne usługi Bing (np. Translation) można również zautomatyzować za pomocą WebClient.
Mam już nazwę konta Microsoft i hasło oraz adres URL zwrotny "local-mydomain.com" ustawiony w interfejsie GUI aplikacji Bing Ads (i mieć wpis HOSTS dla local-mydomain.com).
Wygląda na to, że Microsoft sample działa, ale automatyzuje kontrolę MS Web Browser, oczekuje od użytkownika wprowadzenia danych uwierzytelniających w interfejsie GUI, a następnie podaje token. Podanie konta superadministratora użytkownikom, aby to zrobić, nie jest opcją. Oczekiwanie, że użytkownik wstanie o 3:00 rano w celu uwierzytelnienia w celu przesłania/pobrania danych, nie jest opcją. Oczekiwanie, że użytkownik uzyska dostęp pulpitu do serwera w farmie, aby "uruchomić coś", nie jest opcją.
Wszystkie pomysły OAuth zostały docenione.
Dzięki.
Oto kod uruchomienie:
partial class OAuthForm : Form
{
private static OAuthForm _form;
private static WebBrowser _browser;
private static string _code;
private static string _error;
// When you register your application, the Client ID is provisioned.
private const string ClientId = "000redacted000";
// Request-related URIs that you use to get an authorization code,
// access token, and refresh token.
private const string AuthorizeUri = "https://login.live.com/oauth20_authorize.srf";
private const string TokenUri = "https://login.live.com/oauth20_token.srf";
private const string DesktopUri = "https://login.live.com/oauth20_desktop.srf";
private const string RedirectPath = "/oauth20_desktop.srf";
private const string ConsentUriFormatter = "{0}?client_id={1}&scope=bingads.manage&response_type=code&redirect_uri={2}";
private const string AccessUriFormatter = "{0}?client_id={1}&code={2}&grant_type=authorization_code&redirect_uri={3}";
private const string RefreshUriFormatter = "{0}?client_id={1}&grant_type=refresh_token&redirect_uri={2}&refresh_token={3}";
// Constructor
public OAuthForm(string uri)
{
InitializeForm(uri);
}
[STAThread]
static void Main()
{
// Create the URI to get user consent. Returns the authorization
// code that is used to get an access token and refresh token.
var uri = string.Format(ConsentUriFormatter, AuthorizeUri, ClientId, DesktopUri);
_form = new OAuthForm(uri);
// The value for "uri" is
// https://login.live.com/oauth20_authorize.srf?client_id=000redacted000&scope=bingads.manage&response_type=code&redirect_uri=https://login.live.com/oauth20_desktop.srf
_form.FormClosing += form_FormClosing;
_form.Size = new Size(420, 580);
Application.EnableVisualStyles();
// Launch the form and make an initial request for user consent.
// For example POST /oauth20_authorize.srf?
// client_id=<ClientId>
// &scope=bingads.manage
// &response_type=code
// &redirect_uri=https://login.live.com/oauth20_desktop.srf HTTP/1.1
Application.Run(_form); // <!---------- Problem is here.
// I do not want a web browser window to show,
// I need to automate the part of the process where
// a user enters their name/password and are
// redirected.
// While the application is running, browser_Navigated filters traffic to identify
// the redirect URI. The redirect's query string will contain either the authorization
// code if the user consented or an error if the user declined.
// For example https://login.live.com/oauth20_desktop.srf?code=<code>
// If the user did not give consent or the application was
// not registered, the authorization code will be null.
if (string.IsNullOrEmpty(_code))
{
Console.WriteLine(_error);
return;
}
'Próbka Microsoft wydaje się działać, ale automatyzuje przeglądarki internetowej MS sterowania, spodziewa się użytkownikowi poświadczenia wejściowych w GUI' można pokazać, że fragment kodu może używasz Poświadczenia Enum niepoprawnie, jeśli jest potrzebne .. – MethodMan
@DJKRAZE, problem nie jest Enum, to że kontrola WinFit + przeglądarka internetowa jest wymagana w próbce MS, aby uzyskać token. Nie mogę mieć obiektu COM GUI pojawiały się na serwerze siedzącym w szafie tylko po to, aby uzyskać token uwierzytelniania. Moim prawdziwym problemem jest brak umiejętności wysyłania poświadczeń w czystym kodzie, aby odzyskać token - bez GUI. Dzięki. – Snowy
czy możesz pokazać, co masz do tej pory proszę .. to nie powinno wydawać się trudne, zwykle większość obiektów, które używają tokenu lub nazwy użytkownika \ hasło domeny na przykład mają właściwość 'PropertyName.UseDefaultCredentials' na przykład możesz pokazać kod – MethodMan