Forum Discussion
Hi Steve_PP ,
Can I bother you for the
ExtractAuthorizationCode proceedure, it would help enormously.
Thanks
Trish
Hi Trish, sure.
// Helper function to extract the authorization code from the URL
private static string ExtractAuthorizationCode(string uri)
{
var uriObj = new Uri(uri);
var queryParams = HttpUtility.ParseQueryString(uriObj.Query);
return queryParams["code"];
}
Here's the whole class:
public static class OAuthLogin
{
private const string CsOAuthServer = "https://secure.myob.com/oauth2/account/authorize/";
private const string CsOAuthScope = "CompanyFile";
private static string _currentUri = string.Empty;
public static async Task<string> GetAuthorizationCode(IApiConfiguration config)
{
// Format the URL for the OAuth server login
string url = string.Format("{0}?client_id={1}&redirect_uri={2}&scope={3}&response_type=code",
CsOAuthServer, config.ClientId, HttpUtility.UrlEncode(config.RedirectUrl), CsOAuthScope);
// Create a new form with WebView2
var frm = new Form();
var webView2 = new WebView2
{
Dock = DockStyle.Fill
};
frm.Controls.Add(webView2);
// Set up a TaskCompletionSource to signal when the form can close
var tcs = new TaskCompletionSource<string>();
// Subscribe to NavigationCompleted to capture the OAuth redirect
webView2.CoreWebView2InitializationCompleted += (sender, args) =>
{
if (args.IsSuccess)
{
// Navigate to the OAuth login URL
webView2.CoreWebView2.Navigate(url);
}
};
// Capture the URL in NavigationStarting
webView2.NavigationStarting += (sender, args) =>
{
// Store the URI when navigation starts
_currentUri = args.Uri;
};
// Use NavigationCompleted to check if the URI contains the authorization code
webView2.NavigationCompleted += (sender, args) =>
{
if (_currentUri.Contains("code="))
{
// Extract the authorization code from the URL
string code = ExtractAuthorizationCode(_currentUri);
// Signal the TaskCompletionSource that the form can close with the code
tcs.SetResult(code);
// Close the form
frm.Invoke((MethodInvoker)(() => frm.Close()));
}
};
// Initialize WebView2 control asynchronously
await webView2.EnsureCoreWebView2Async(null);
frm.Size = new Size(800, 600);
frm.Show();
// Wait until the TaskCompletionSource is signaled (form is closed)
string authCode = await tcs.Task;
return authCode;
}
// Helper function to extract the authorization code from the URL
private static string ExtractAuthorizationCode(string uri)
{
var uriObj = new Uri(uri);
var queryParams = HttpUtility.ParseQueryString(uriObj.Query);
return queryParams["code"];
}
}
Looking for something else?
Search the Community Forum for answers or find your topic and get the conversation started!
Find technical support and help for all MYOB products in our online help centre
Dig into MYOB Academy for free courses, learning paths and live events to help build your business with MYOB.