Forum Discussion

Kruts's avatar
Kruts
Experienced Partner
3 years ago

doco makes reference to OAuthLogin.GetAuthorizationCode...where is this class?

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?? 

  • 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.

     

     

    • Hamishjam's avatar
      Hamishjam

      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.

      • kjm's avatar
        kjm
        Trusted Cover User

        Have you got the access token? Hamishjam 

        I have not used the class that was uploaded by John_Dinning  so I cannot comment on whether it works or not but I have built my own class to get the access token

        maybe that was why the class was removed from the online sample but like I said I have not tried using it..

        If you have the access token then just create a SimpleOAuthKeyService and assign the values from the token to it and you should be able to run the following.  

        let me know how you get on. If I have time I'll build a test harness and upload it to github for others that are stuck here...seriously considering leaving the .NET SDK and just using RestSharp/HttpClient to access the API

         

          var keystore = new SimpleOAuthKeyService();
                        keystore.OAuthResponse = new OAuthTokens
                        {
                            AccessToken = myobTokens.AccessToken,
                            ExpiresIn = int.Parse(myobTokens.ExpiresIn),
                            ReceivedTime = myobTokens.TokenTime,
                            RefreshToken = myobTokens.RefreshToken,
                            Scope = myobTokens.Scope,
                            TokenType = myobTokens.TokenType
                        };
        
        
        
                        // Get Company Files
                        var cfService = new CompanyFileService(configuration, null, keystore);
                        var companies = cfService.GetRange();
        
                        foreach (var company in companies)
                        {
                            System.Console.WriteLine(company.Name);
                            Debug.WriteLine(company.Name);
                        }

         

  • kjm's avatar
    kjm
    Trusted Cover User

    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..

    • PhilWherrett's avatar
      PhilWherrett
      Experienced User

      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.

      • kjm's avatar
        kjm
        Trusted Cover User

        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