¿Por qué HttpClient.GetAsync provoca la apertura del enlace en el navegador?
Supongamos que tenemos una aplicación que quiere acceder a la popular red social rusa VK y está escrita en C # con WinForms GUI. VK utiliza un enfoque similar a OAuth2, por lo que debemos abrir el navegador web con la URL de autorización vk oauth. Luego nos suscribimos al evento OnNavigated de webBrowser y esperamos hasta que la URL no sea igual a alguna URL predefinida con token de acceso en la cadena de consulta. De ahora en adelante, podemos llamar a los métodos vk utilizando el token de acceso recibido, pero aquí ocurren algunas cosas extrañas: cuando trato de invocar algunos métodos vk con HttpClient.GetAsync (methodUri), todo va de acuerdo al plan, excepto abrir el enlace desde navegador web de autorización en el navegador web del sistema. La URL de autorización del cliente de vk se parece ahttps://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display={displayType}&response_type=token
, Url con acceso recibidoToken parecehttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId}
, observe el signo de número en su lugar en el signo de interrogación.
código en forma principal:
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);
autenticación Código de clase de formulario:
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.Código de autenticación:
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;
}
después de salir (usando el depurador)var response = await httpClient.GetAsync(request);
línea del formulario principal, mi navegador del sistema abre un enlace comohttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId} - #access_token={accessToken}&expires_in={expiresIn}&user_id={userId}
con valores recientes de accessToken, expiresIn y userId. Si con... - #access_token=....
en url. No tengo idea de por qué puede suceder esto, pero me preocupa el signo del número.
Además importante: solo sucede si el navegador web no tiene información sobre una sesión o si esta ha expirado, es decir, tengo que ingresar el nombre de usuario y la contraseña en el formulario de inicio de sesión de vk. si las cookies contienen la información necesaria y se redirige automáticamente a la página que contiene el token en su url (con#
firmar de nuevo), todo funciona como se esperaba