2

人気のあるロシアのソーシャル ネットワーク VK にアクセスする必要があり、WinForms GUI を使用して C# で記述されたアプリケーションがあるとします。VK は OAuth2 と同様のアプローチを使用するため、vk oauth 承認 URL を使用して Web ブラウザーを開く必要があります。次に、webBrowser の OnNavigated イベントをサブスクライブし、クエリ文字列にアクセス トークンを含む事前定義された URL と URL が一致しなくなるまで待機します。これからは、受信したアクセス トークンを使用して vk メソッドを呼び出すことができますが、ここでいくつかの奇妙なことが起こります: HttpClient.GetAsync(methodUri) でいくつかの vk メソッドを呼び出そうとすると、システムの Web ブラウザーで認証 Web ブラウザー。vk のクライアント認証 URL は のように表示されhttps://oauth.vk.com/authorize?client_id={clientId}&scope={scope}&redirect_uri=https://oauth.vk.com/blank.html&display={displayType}&response_type=token、accessToken を受信した 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=....。なぜこれが起こるのかわかりませんが、番号記号が心配です.

重要な追加: Web ブラウザーにセッションに関する情報がないか、有効期限が切れている場合にのみ発生します。つまり、vk のログイン フォームにユーザー名とパスワードを入力する必要があります。Cookie に必要な情報が含まれていて、URL にトークンを含むページに自動的にリダイレクトされる場合 (#再度記号を付けて)、すべてが期待どおりに機能します。

4

0 に答える 0