Forum Discussion
Howdy Again kjm ,
I've just started on this implementation myself - sounds like we've headed down the same path using HttpListener - but I'm not sure how to handlethe redirect if the redirect Url is http://desktop as per MYOBs recommendation when creating the API Key. I can get a code using http://localhost as a redirect Url.
I'd be keen to get code examples of your implementation if you're willing to share (I can't seem to work out how to send you a PM :-()?
Cheers,
Phil.
Hi PhilWherrett
To PM I think just hover over avatar and click on "Send Message"
I have the redirect set to http://127.0.0.1 I suppose you could modify the host file so that http://desktop resolves to this or localhost but not sure why myob are recommending that. Dont you simply need a socket for the httpListener so that it know where to listen for the response?
I have this in a in a base class
public class BaseAuthenticator { // ref http://stackoverflow.com/a/3978040 private static int GetRandomUnusedPort() { var listener = new TcpListener(IPAddress.Loopback, 0); listener.Start(); var port = ((IPEndPoint)listener.LocalEndpoint).Port; listener.Stop(); return port; } public string GetRedirectUri => $"http://{IPAddress.Loopback}:{GetRandomUnusedPort()}/"; }
private string GetAuthorizationCode() { var redirectUri = GetRedirectUri; Output("redirect URI: " + redirectUri); // Creates an HttpListener to listen for requests on that redirect URI. var httpListener = new HttpListener(); httpListener.Prefixes.Add(redirectUri); Output("Listening.."); httpListener.Start(); // Creates the OAuth 2.0 authorization request. var authorizationRequest = string.Format("{0}?response_type=code&scope=CompanyFile&redirect_uri={1}&client_id={2}", AuthorizationCodeEndpoint, System.Uri.EscapeDataString(redirectUri), ClientId); // Opens request in the browser. System.Diagnostics.Process.Start(authorizationRequest); // Waits for the OAuth authorization response. var context = httpListener.GetContext();
var response = context.Response; }
then get the response and parse it for the code
happy to give you the whole code if you're still stuck
- PhilWherrett3 years agoExperienced User
Howdy kjm ,
Yep I tried to do that for the PM - but the page I get sent to doesn't render properly to allow sending anything:
Your code snippets are pretty much what I'm doing so thanks for sharing and confirming that I'm heading in the right direction :-)
I've managed to successfully get a code response and return the company files available so that's good.
Now just need to add the managing of token storage and refresh lifecycle so subsequent calls don't need to go through additional code requests.
Cheers,
Phil.
- Hamishjam3 years agoContributing User
Hey, I also wound up in MYOB website 404 land sorting this out. I've played with the code from KJM to spit out the auth code in a .NET core WPF app. It's a bit rough at this stage but seems to do the trick as a replacement for the lost OAuthLogin.GetAuthorizationCode:
private string GetAuthorizationCode() { var redirectUri = $"http://localhost:8080/"; var developerKey = "blah blah"; var AuthorizationCodeEndpoint = "https://secure.myob.com/oauth2/account/authorize";
// Creates an HttpListener to listen for requests on that redirect URI. var httpListener = new HttpListener(); httpListener.Prefixes.Add(redirectUri); // Listening httpListener.Start(); // Creates the OAuth 2.0 authorization request. var authorizationRequest = string.Format("{0}?response_type=code&scope=CompanyFile&redirect_uri={1}&client_id={2}", AuthorizationCodeEndpoint, System.Uri.EscapeDataString(redirectUri), developerKey); // Opens request in the browser. var ps = new ProcessStartInfo(authorizationRequest) { UseShellExecute = true, Verb = "open" }; Process.Start(ps); //System.Diagnostics.Process.Start(authorizationRequest); // Waits for the OAuth authorization response. var context = httpListener.GetContext(); var request = context.Request; httpListener.Stop(); var uri = new Uri(request.Url.OriginalString); var query = System.Web.HttpUtility.ParseQueryString(uri.Query); var code = query.Get("code"); return code; }- John_Dinning3 years agoTrusted User
Hi Hamishjam,
The lost OAuthLogin.GetAuthorizationCode is in the zip file attached to my last post.
Let me know if you can't get access to it.
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.