Thank you for visiting our Partner Zone. This area is an exclusive space for MYOB Partners. Find out how to Partner with MYOB.
August 2022 - last edited August 2022
August 2022 - last edited August 2022
following example here Cloud Service – Support for the MYOB family of SME product APIs
and have installed the SDK but it is not finding OAuthLogin class from line 6 below
what do I need to reference?
var developerKey = "YOUR API KEY"; var developerSecret = "YOUR API SECRET"; var configuration = new ApiConfiguration(developerKey, developerSecret, "http://desktop"); var oauthService = new OAuthService(configuration); var tokens = oauthService.GetTokens(OAuthLogin.GetAuthorizationCode(configuration)); var keystore = new SimpleOAuthKeyService(); keystore.OAuthResponse = tokens; // Get Company Files var cfService = new CompanyFileService(configuration, null, keystore); var companyFiles = cfService.GetRange();
it says : The function OAuthLogin.GetAuthorizationCode is a helper class created in the samples that illustrates how to create a form that launches the secure.myob.com my.MYOB login page.
what samples??
September 2022 - last edited September 2022
September 2022 - last edited September 2022
posting from my other now linked dev account
I have solved this myself. little bit "surprised" at the lack of support both from myob and community. maybe these forums arent that busy/alive..
anyway..got the access code and passed it in..looks like ths SDK has a problem from there on in as I am returned a Bad Request
I have built own classes to extract the tokens using a httpListener and it works fine whic his why Ican verify that I am getting the correct access code
If anyone gets stuck like I did PM and I'll be happy to share code..
September 2022
September 2022
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.
September 2022 - last edited September 2022
September 2022 - last edited September 2022
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
September 2022
September 2022
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.
September 2022
September 2022
Hi Kruts,
Sorry for the late reply, I have not been monitoring this forum. I have OAuthLogin.cs and OAuthKeyService.cs that I believe were originally included in the C# samples provided by MYOB on their github which doesn't seem to exist any more.
As far as I know, these are unmodified and still work. Hopefully MYOB won't mind me attaching these. Perhaps they could make them accesible to others again.
September 2022
September 2022
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; }
September 2022
September 2022
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.
September 2022
September 2022
Cheers John - I came back to the forum and saw you posted this after I spent an hour stuffing around with it
September 2022
September 2022
I'm now having issues with the CompanyFileService.GetRange() method. Using:
// Get Company Files var companyFileService = new MYOB.AccountRight.SDK.Services.CompanyFileService(configuration,null,oAuthKeyService); var companyFiles = companyFileService.GetRange();
GetRange() is throwing the following exception:
MYOB.AccountRight.SDK.ApiOperationException: 'Encountered an operation error (https://secure.myob.com/oauth2/account/authorize/)'
Inner Exception:
JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 2, position 1
I'm working in a .NET 6 WPF solution.