почему HttpClient.GetAsync вызывает открытие ссылки в браузере?
Предположим, у нас есть приложение, которое хочет получить доступ к популярной русской социальной сети ВКонтакте и написано на C # с WinForms GUI. VK использует OAuth2-подобный подход, поэтому нам нужно открыть веб-браузер с vk oauth-авторизацией url. Затем мы подписываемся на событие OnNavigated webBrowser и ждем, пока URL не будет равен некоторому предварительно определенному URL с токеном доступа в строке запроса. Отныне мы можем вызывать методы vk, используя полученный токен доступа, но здесь происходят некоторые странные вещи: когда я пытаюсь вызвать некоторые методы vk с помощью HttpClient.GetAsync (methodUri), все идет по плану, за исключением открытия ссылки из Авторизация веб-браузера в системном веб-браузере. URL авторизации клиента вк выглядит такhttps://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display={displayType}&response_type=token
URL с полученным доступом похож наhttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId}
Обратите внимание на знак числа вместо знака вопроса.
код в основной форме:
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:
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 код:
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;
}
после выхода (используя отладчик)var response = await httpClient.GetAsync(request);
строка из основной формы, мой системный браузер открывает ссылку, какhttps://oauth.vk.com/blank.html#access_token={accessToken}&expires_in={expiresIn}&user_id={userId} - #access_token={accessToken}&expires_in={expiresIn}&user_id={userId}
с последними значениями accessToken, expiresIn и userId. Да, с... - #access_token=....
в URL Я понятия не имею, почему это может произойти, но я обеспокоен тем, что знак числа.
Важное дополнение: это происходит только в том случае, если в веб-браузере нет информации о сеансе или срок его действия истек, то есть я должен ввести имя пользователя и пароль в форму входа в систему vk. если файлы cookie содержат необходимую информацию и они автоматически перенаправляются на страницу, содержащую токен в своем URL (с#
перепишитесь) все работает как положено