Warum bewirkt HttpClient.GetAsync, dass der Link im Browser geöffnet wird?
Angenommen, wir haben eine Anwendung, die auf das beliebte russische soziale Netzwerk VK zugreifen möchte und mit der WinForms-GUI auf C # geschrieben wurde. VK verwendet den OAuth2-ähnlichen Ansatz, daher müssen wir den Webbrowser mit der vk oauth-Berechtigungs-URL öffnen. Dann abonnieren wir das OnNavigated-Ereignis von webBrowser und warten, bis die URL einer vordefinierten URL mit Zugriffstoken in der Abfragezeichenfolge nicht mehr entspricht. Ab jetzt können wir vk-Methoden mit dem empfangenen Zugriffstoken aufrufen, aber hier passieren einige merkwürdige Dinge: Wenn ich versuche, einige vk-Methoden mit HttpClient.GetAsync (methodUri) aufzurufen, läuft alles nach Plan, außer dass der Link von der geöffnet wird Autorisierungs-Webbrowser im System-Webbrowser. Die Client-Berechtigungs-URL von vk sieht so aushttps://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display={displayType}&response_type=token
, Url mit erhaltenem accessToken sieht aus wiehttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId}
Beachten Sie stattdessen das Nummernzeichen auf dem Fragezeichen.
Code in Hauptform:
var authenticationForm = new AuthenticationForm();
authenticationForm.Show();
_authenticatedUser = await application.ClientAuthenticator.Authenticate(authenticationForm.GetToken);
authenticationForm.Close();
var httpClient = new HttpClient();
var request = "https://api.vk.com/method/users.get.xml?user_ids=1&fields=online";
var response = await httpClient.GetAsync(request);
authenticationForm-Klassencode:
public partial class AuthenticationForm : Form
{
private readonly TaskCompletionSource<VkAccessToken> _tokenCompletitionSource = new TaskCompletionSource<VkAccessToken>();
private Uri _redirectUri;
public AuthenticationForm()
{
InitializeComponent();
}
public async Task<IVkAccessToken> GetToken(Uri authUri, Uri redirectUri)
{
authenticationBrowser.Navigate(authUri);
_redirectUri = redirectUri;
var token = await _tokenCompletitionSource.Task;
return token;
}
private async void authenticationBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
if (!(_redirectUri.IsBaseOf(e.Url) && _redirectUri.AbsolutePath.Equals(e.Url.AbsolutePath))) return;
//working with e.Url to achieve token, userId and expiresIn, creating token variable based on them
_tokenCompletitionSource.SetResult(token);
}
}
ClientAuthenticator.Authenticate Code:
public async Task<IVkAuthenticatedUser> Authenticate(Func<Uri, Uri, Task<IVkAuthenticatedUser>> aunthenticationResultGetter)
{
var authorizationUri =
new Uri("https://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display=page&response_type=token");
var token = await aunthenticationResultGetter(authorizationUri, _application.Settings.RedirectUri);
//...
return newUserBasedOnToken;
}
nach dem Ausstieg (mit Debugger)var response = await httpClient.GetAsync(request);
Zeile aus dem Hauptformular, mein Systembrowser öffnet den Link wiehttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId} - #access_token={accessToken}&expires_in={expiresIn}&user_id={userId}
mit den letzten accessToken, expiresIn und userId Werten. Ja mit... - #access_token=....
in url. Ich habe keine Ahnung, warum das passieren könnte, aber ich mache mir Sorgen, dass die Nummer unterschreibt.
wichtiger zusatz: es passiert nur, wenn der webbrowser keine informationen über eine sitzung hat oder abgelaufen ist, das heißt, ich muss einen benutzernamen und ein passwort in das anmeldeformular von vk eingeben. Wenn Cookies die erforderlichen Informationen enthalten und automatisch auf die Seite mit dem Token in der URL (mit) umgeleitet werden#
wieder unterschreiben) funktioniert alles wie erwartet