#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 в качестве веб-браузера. У него есть ошибка загрузки-событие, которое срабатывает, когда я нажимаю кнопку разрешить. Таким образом, я могу получить ответ и закрыть форму / веб-браузер с помощью кода.