Autodesk Forge: На 3-х значном экране «Авторизация приложения»: кнопка «Разрешить» не отвечает

#c# #oauth #autodesk-forge

Вопрос:

Я хотел создать 3-сторонний OAuth на рабочем столе (C#) для Autodesk forge. Я основал свое приложение на статье 3-ножный OAuth для настольных приложений (C# и WinForm). Когда я запускаю свою программу, она позволяет мне ввести имя пользователя, а затем пароль. Но когда дело доходит до «Авторизовать приложение», оно не реагирует, когда я нажимаю кнопку «Разрешить». Он становится темно-синим, когда я навожу на него курсор, но не реагирует ни на один щелчок.

Я использую ngrok для «захвата» обратного вызова.

введите описание изображения здесь

     [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public partial class oAuthForm : Form
    {
        private const string FORGE_CLIENT_ID = "abcdefghijklmnopqrstuvwxyz";
        private const string FORGE_CLIENT_SECRET = "zyxwvutsrqp";
        private const string FORGE_CALLBACK_URL = "https://bff25109c9dc.ngrok.io";
        private const string FORGE_BASE_URL = "https://developer.api.autodesk.com";
        private const string FORGE_SCOPE = "data:read data:write data:create data:search bucket:create bucket:read bucket:update bucket:delete"; // assuming a full scope

        private WebBrowser2 wb = new WebBrowser2();

        public oAuthForm()
        {
            InitializeComponent();

            wb.Dock = DockStyle.Fill;
            wb.NavigateError  = new WebBrowserNavigateErrorEventHandler(wb_NavigateError);
            Controls.Add(wb);

            // this is a basic code sample, quick amp; dirty way to get the Authentication string
            string authorizeUrl = FORGE_BASE_URL   string.Format("/authentication/v1/authorize?response_type=codeamp;client_id={0}amp;redirect_uri={1}amp;scope={2}", FORGE_CLIENT_ID, FORGE_CALLBACK_URL, WebUtility.UrlEncode(FORGE_SCOPE));

            // now let's open the Authorize page.
            wb.Navigate(authorizeUrl);
        }

        private void wb_NavigateError(object sender, WebBrowserNavigateErrorEventArgs e)
        {
            // This will track errors: we want to track the 404 when the login
            // page redirects to our callback URL, let's check if is the error
            // we're tracking.
            Uri callbackURL = new Uri(e.Url);
            if (e.Url.IndexOf(FORGE_CALLBACK_URL) == -1)
            {
                MessageBox.Show("Sorry, the authorization failed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // extract the code
            var query = HttpUtility.ParseQueryString(callbackURL.Query);
            string code = query["code"];

            // now we have the code, let's make a Http call to 
            // /authentication/v1/gettoken 
            // and get the access_token...

            // you can use RestSharp for it, but I'll stop the sample here

            // you may want to close this form..
            this.Close();
        }
    }
 

Решение Visual Studio можно найти здесь.

Комментарии:

1. Есть ли способ захватить какие-либо журналы консоли из компонента webview в приложении C#? Если кнопка «Разрешить» не реагирует, я думаю, что могут быть некоторые ошибки, которые препятствуют продолжению работы страницы.

2. Я искал способ записи журналов, но не мог найти, как это сделать. Я нашел решение в использовании CefSharp в качестве веб-браузера. У него есть ошибка загрузки-событие, которое срабатывает, когда я нажимаю кнопку разрешить. Таким образом, я могу получить ответ и закрыть форму / веб-браузер с помощью кода.