Forum Discussion
Hi Steve_PP ,
Can I bother you for the
ExtractAuthorizationCode proceedure, it would help enormously.
Thanks
Trish
- Steve_PP3 months agoExperienced User
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"];
}}
- Digiwise3 months agoTrusted User
Hi Steve and other developers.
This thread was very helpful in getting my solution running again. Thank you for sharing the helpful information!
Just a note that I ran into a problem when my app was installed in the Program Files (x86) folder. WebView2 needs to create a user data folder and it can't create that folder under Program Files. The version I am using doesn't give an error message when it can't create the folder - it just didn't display the browser.
I found the fix at https://github.com/MicrosoftEdge/WebView2Feedback/issues/297 - there is code there to set the data folder:
public BrowserForm(string url = null) { InitializeComponent(); InitializeBrowser(url); } private async void InitializeBrowser(string url = null) { var userDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\SoftwareName"; var env = await CoreWebView2Environment.CreateAsync(null, userDataFolder); await webView21.EnsureCoreWebView2Async(env); webView21.Source = new UriBuilder(url ?? Settings.Default.HomePage).Uri; }
Hope this helps!
Clancy
- eJulia3 months agoTrusted User
Hi Steve,
I do not use the sdk as we created private version to integrate it withour error logging back in 2013 when we implemented the first of our apps. I am trying to implement your code right now and striking a problem that it does not recognise WebView2.CoreWebView2InitializationCompleted
I have downloaded and installed the nuget package Microsoft.Web,WebView2 and by referencing it and inserting "using WebView2 = Microsoft.Web.WebView2;" in an appropriate spot it accepted some of your code.
I earlier updated from .NET Framework 4.6.2 to 4.7.2 in a desperate hope that would make this problem go away when it first appeared. The WebView2 I downloaded appears to target 4.6.2 or better.
Is there some other thing I need to download/reference/using to make thi swork.
It is urgent. We have over 100 users most of whom use the online version. If they need to reconfigure to a new file or install on a new PC they are in trouble. Any potential new user trying out the 30 day trial is going to walk away in disgust until we have this fixed.
- Steve_PP3 months agoExperienced User
My test app is .NET 4.7.2 and is WinForms based. If you are using WinForms, you need this namespace:
using Microsoft.Web.WebView2.WinForms;
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.