Page 1 of 5 1 2 3 ... LastLast
Results 1 to 15 of 69

Thread: Exact online Oauth met Indy tidhttp

  1. #1
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40

    Exact online Oauth met Indy tidhttp

    Beste mensen,
    Ik ben al een tijdje aan het stoeien met Oauth om te kunnen communiceren met exact online. Ik krijg het voor elkaar om een idhttp.get commando naar Exact te sturen en krijg dan als response een HTML tekst die, als ik hem inlees in een twebbrowser, een inlog pagina toont. Inloggen lukt in de webbrowser, maar dan??? Wat ik dus niet begrijp is hoe ik deze response kan gebruiken om verder de komen met de autorisatie om zo een communicatie met exact op te zetten. Ik ben volkomen nieuw met API programmeren, dus als iemand me op weg kan helpen, of nog mooier, een werkend voorbeeldje zou willen geven, dan zou ik daar erg mee geholpen zijn. Alvast bedankt voor jullie reactie.
    Jaap Thesing

  2. #2
    Vaak is het met Oauth sites dat je dus een authenticatie-scherm krijgt in je browser. Je moet die dan accepteren en dan wordt je doorgestuurd naar een pagina waarop de uiteindelijk access_token staat. Die kun je programmatisch uit proberen te lezen of de gebruiker moet die handmatig in je applicatie intikken. Zo gaat het in ieder geval met de Google XOAuth 2.0.

    Volgens mij werkt Exact ook zo:
    https://developers.exactonline.com/C..._Tutorial.html

    Nu zie ik echter op die pagina van Exact dat je een redirect_uri op moet geven (b.v. https://www.mycompany.com/myapplication). Dat moet dus een web-pagina zijn op je eigen site zodat je daarop je token uit kunt lezen. Na de authenticatie van de gebruiker wordt deze vaak naar die pagina doorgestuurd met een parameter ?acces_token=xxxxxx (of zoiets). Bij Google heb je de mogelijkheid om "urn:ietf:wg:oauth:2.0:oob" op te geven als redirect_uri zodat er in de browser een pagina geopend wordt waarin je access_token staat. Die kun je dan via het browser-object uitlezen. Of Exact zoiets kent weet ik niet.

    Edit:
    If you are making a desktop application, set Callback URL to http://localhost:portnumber. When authenticating in app mode, the driver creates an HTTP listener on an available port on the local machine. You'll need to be sure to set the port number when you set the OAuthCallbackURL in the driver. The HTTP listener obtains the callback URL from Exact Online and retrieves the token that verifies the user has authorized the connecting application.
    (bron: http://cdn.rssbus.com/help/DY1/jdbc/...ingtoexact.htm)

    Ok. Je moet dus als URI dit gebruiken: http://localhost:portnumber.
    Daarna zul je dus een kleine http server moeten draaien waarop je die parameters met access_token kunt ontvangen.

    Heb je overigens wel je App al geregistreerd e.d. om een clientid en clientsecret te krijgen of was je nog helemaal niet zo ver in het "leerproces" ??
    https://developers.exactonline.com/#...ation%7C_____1
    Last edited by rvk; 07-Jul-15 at 13:17.

  3. #3
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40

    Redirect

    Bedankt, hier kan ik wel wat mee. Hoe ik die redirect moet uitlezen moet ik me nog in verdiepen, maar ik ben weer een stapje verder. Ik heb mijn app al geregistreerd en heb een id + een secret. Wel jammer dat er op de developers site van Exact zo veel voorkennis over API programmeren wordt verondersteld en dat er geen Delphi code staat..



    Quote Originally Posted by rvk View Post
    Vaak is het met Oauth sites dat je dus een authenticatie-scherm krijgt in je browser. Je moet die dan accepteren en dan wordt je doorgestuurd naar een pagina waarop de uiteindelijk access_token staat. Die kun je programmatisch uit proberen te lezen of de gebruiker moet die handmatig in je applicatie intikken. Zo gaat het in ieder geval met de Google XOAuth 2.0.

    Volgens mij werkt Exact ook zo:
    https://developers.exactonline.com/C..._Tutorial.html

    Nu zie ik echter op die pagina van Exact dat je een redirect_uri op moet geven (b.v. https://www.mycompany.com/myapplication). Dat moet dus een web-pagina zijn op je eigen site zodat je daarop je token uit kunt lezen. Na de authenticatie van de gebruiker wordt deze vaak naar die pagina doorgestuurd met een parameter ?acces_token=xxxxxx (of zoiets). Bij Google heb je de mogelijkheid om "urn:ietf:wgauth:2.0ob" op te geven als redirect_uri zodat er in de browser een pagina geopend wordt waarin je access_token staat. Die kun je dan via het browser-object uitlezen. Of Exact zoiets kent weet ik niet.

    Edit:

    (bron: http://cdn.rssbus.com/help/DY1/jdbc/...ingtoexact.htm)

    Ok. Je moet dus als URI dit gebruiken: http://localhostortnumber.
    Daarna zul je dus een kleine http server moeten draaien waarop je die parameters met access_token kunt ontvangen.

    Heb je overigens wel je App al geregistreerd e.d. om een clientid en clientsecret te krijgen of was je nog helemaal niet zo ver in het "leerproces" ??
    https://developers.exactonline.com/#...ation%7C_____1

  4. #4
    Quote Originally Posted by jthesing View Post
    Hoe ik die redirect moet uitlezen moet ik me nog in verdiepen
    O, maar dat gaat vrij "eenvoudig". ;)

    Maak een TIdHTTPServer aan. Zet de DefaultPort op hetzelfde wat je bij die redirect_uri opgegeven hebt.
    b.v. http://localhost:8080 dan zet je de DefaultPort op 8080.
    Zet de TIdHTTPServer op Active en je hebt een kleine HTTP server

    Je moet in je Api (daar waar je je clientid e.d. hebt gekregen) wel de redirect_uri even op http://localhost:8080 zetten.

    Nu kun je de gebruikers dus via de browser (CreateOleObject of gewoon via Open) naar de authentication pagina.
    Code:
    http://start.exactonline.nl/api/oauth2/auth?client_id=CIENTID&redirect_uri=http://localhost:8080&response_type=code
    (Ik weet niet zeker of het dit adres is maar zo iets dergelijks)

    Die wordt automatisch na eenmalig invoeren van het wachtwoord naar jouw TIdHTTPServer verwezen (in de browser).

    Nu kun je in de event OnCommandGet (dus IdHTTPServer1CommandGet) de ARequestInfo.Params.Text uitlezen.
    Daar staat in ?code=abcde. De abcde is dan je authorization_token.
    Met die authorization_token kun je vervolgens een refresh_token en access_token aanvragen.
    Dit kan gewoon via de normale GET-componenten van Indy. Er is geen user-interactie meer nodig.

    De browser zou je kunnen sluiten (als het een CreateOleObject is) anders kun je een pagina laten zien dat ze de browser kunnen sluiten.

    De access_tokens zijn bij Exact Online geloof ik maar 10 minuten geldig maar zolang je de refresh_token op slaat kun je daarmee altijd weer nieuwe access_tokens aanvragen.

    Voor Exact Online en OAuth 2 ben ik inderdaad weinig tegen gekomen. Ik ben zelf wel bezig een library te maken voor de Google Api OAuth 2.0 in Lazarus/FPC om mail te versturen via Google en om de Google Calender te raadplegen. Het mechanisme van OAuth 2.0 voor Google en Exact zijn vrijwel hetzelfde.

  5. #5
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Bedankt voor je reactie. Dat klinkt inderdaad heel eenvoudig en logisch. Het is alleen zo dat als ik de redirect op http://localhost:8080 zet, dat ik dan een invalid authorization request krijg en geen inlog mogelijkheid. Moet ik in de idhttp component wellicht nog iets aanpassen? Ook met jouw link (met de juiste clientid) krijg ik een autorization error. Dit is de code die ik via get stuur:
    https://start.exactonline.nl/api/oauth2/auth?client_id={mijn id}&clientsecret={mijn secret}&redirect_uri=http://localhost:8080&response_type=code&force_login=0'
    Zit hier nog een fout in?

    Quote Originally Posted by rvk View Post
    O, maar dat gaat vrij "eenvoudig".

    Maak een TIdHTTPServer aan. Zet de DefaultPort op hetzelfde wat je bij die redirect_uri opgegeven hebt.
    b.v. http://localhost:8080 dan zet je de DefaultPort op 8080.
    Zet de TIdHTTPServer op Active en je hebt een kleine HTTP server

    Je moet in je Api (daar waar je je clientid e.d. hebt gekregen) wel de redirect_uri even op http://localhost:8080 zetten.

    Nu kun je de gebruikers dus via de browser (CreateOleObject of gewoon via Open) naar de authentication pagina.
    Code:
    http://start.exactonline.nl/api/oauth2/auth?client_id=CIENTID&redirect_uri=http://localhost:8080&response_type=code
    (Ik weet niet zeker of het dit adres is maar zo iets dergelijks)

    Die wordt automatisch na eenmalig invoeren van het wachtwoord naar jouw TIdHTTPServer verwezen (in de browser).

    Nu kun je in de event OnCommandGet (dus IdHTTPServer1CommandGet) de ARequestInfo.Params.Text uitlezen.
    Daar staat in ?code=abcde. De abcde is dan je authorization_token.
    Met die authorization_token kun je vervolgens een refresh_token en access_token aanvragen.
    Dit kan gewoon via de normale GET-componenten van Indy. Er is geen user-interactie meer nodig.

    De browser zou je kunnen sluiten (als het een CreateOleObject is) anders kun je een pagina laten zien dat ze de browser kunnen sluiten.

    De access_tokens zijn bij Exact Online geloof ik maar 10 minuten geldig maar zolang je de refresh_token op slaat kun je daarmee altijd weer nieuwe access_tokens aanvragen.

    Voor Exact Online en OAuth 2 ben ik inderdaad weinig tegen gekomen. Ik ben zelf wel bezig een library te maken voor de Google Api OAuth 2.0 in Lazarus/FPC om mail te versturen via Google en om de Google Calender te raadplegen. Het mechanisme van OAuth 2.0 voor Google en Exact zijn vrijwel hetzelfde.

  6. #6
    Ik kan het natuurlijk niet uittesten omdat ik geen clientid heb (dan krijg ik een "Client not found").

    Maar heb je in je bij het registreren van de App (toen je die clientid e.d. kreeg) ook die redirect_uri = http://localhost:8080 opgegeven???

    Want als je dat daar niet gedaan hebt dan zien ze dat je opgegeven redirect_uri niet past bij die clientid en zul je wel een "invalid authorization request" krijgen.

    In je idHTTPServer hoef je nog niets aan te passen want zover ben je nog niet. Je zou sowieso een geldig loginscherm moeten krijgen. Pas na op akkoord gedrukt te hebben gaat die browser naar localhost:8080 toe.

  7. #7
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Bedankt voor je snelle reactie! Ik had net een reactie gestuurd toen ik bedacht dat inderdaad mijn redirect uri nog niet was aangepast. Die heb ik vervolgens aangepast en nu krijg ik keurig een inlogscherm te zien. Ik krijg alleen nog geen reactie van de httpserver. De poort staat op 8080 en active is true, maar geen berichten komen terug via de IdHTTPServer1CommandGet.

    Quote Originally Posted by rvk View Post
    Ik kan het natuurlijk niet uittesten omdat ik geen clientid heb (dan krijg ik een "Client not found").

    Maar heb je in je bij het registreren van de App (toen je die clientid e.d. kreeg) ook die redirect_uri = http://localhost:8080 opgegeven???

    Want als je dat daar niet gedaan hebt dan zien ze dat je opgegeven redirect_uri niet past bij die clientid en zul je wel een "invalid authorization request" krijgen.

    In je idHTTPServer hoef je nog niets aan te passen want zover ben je nog niet. Je zou sowieso een geldig loginscherm moeten krijgen. Pas na op akkoord gedrukt te hebben gaat die browser naar localhost:8080 toe.

  8. #8
    Zie je wel dat je browser naar localhost:8080 doorgestuurd wordt?

    Test het eens uit door zelf in de browser naar http://localhost:8080?code=abcdef te gaan.

  9. #9
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Dat is een goede tip. Het gekke is dat als ik mijn idhttpserver op 80 zet en het commando http://localhost:80?code=abcdef (dus 80 ipv 8080) via mijn browser verstuur, dat mijn applicatie wel reageert. Maar poort 8080 werkt dus niet. Ik heb mijn virusscanner even uitgezet, maar daar ligt het ook niet aan. Poort 80 dan maar gebruiken?

  10. #10
    Of je firewall controleren.
    Je applicatie zou wel netwerktoegang moeten krijgen en dat zou door de firewall tegengehouden kunnen worden.

  11. #11
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Ik heb de poort in de netwerktoegang veranderd naar 80, de httpserver op 80 gezet en de twebbrowser gecheckt met een commando via poort 80. Werkt allemaal. Maar geen reactie van Exact nadat ik heb ingelogd. Krijg wel keurig te zien dat er is ingelogd met een clientid en zo, maar er komt geen code binnen via de httpserver.

  12. #12
    Quote Originally Posted by jthesing View Post
    Maar geen reactie van Exact nadat ik heb ingelogd. Krijg wel keurig te zien dat er is ingelogd met een clientid en zo, maar er komt geen code binnen via de httpserver.
    Wordt je na op akkoord gedrukt te hebben niet automatisch naar die localhost:80 doorgezet???

    Je zou in de browser een fout-pagina moeten krijgen (omdat je met je THTTPServer geen pagina doorgeeft) maar dat zou niet erg mogen zijn want de "request" voor die pagina zou wel door IdHTTPServer1CommandGet ontvangen moeten worden.

    Maar zolang jij in je browser niet automatisch "doorgezet" wordt naar localhost gaat dat dus niet werken.

  13. #13
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Quote Originally Posted by rvk View Post
    Wordt je na op akkoord gedrukt te hebben niet automatisch naar die localhost:80 doorgezet???

    Je zou in de browser een fout-pagina moeten krijgen (omdat je met je THTTPServer geen pagina doorgeeft) maar dat zou niet erg mogen zijn want de "request" voor die pagina zou wel door IdHTTPServer1CommandGet ontvangen moeten worden.

    Maar zolang jij in je browser niet automatisch "doorgezet" wordt naar localhost gaat dat dus niet werken.
    ----------------
    Ik krijg in de twebbrowser (nadat ik heb ingelogd) het volgende te zien (clientid en secret vervangen door x):
    auth?client_id={xxxxxx}&clientsecret={xxxxxxxxxxx} &redirect_uri=http://localhost:80&response_type=code&force_login=0
    Ik heb in de server IdHTTPServer1CommandGet handler het commando caption:=ARequestInfo.params.text gezet, maar er gebeurt niets.
    Als ik het commando webbrowser1.navigate('http://localhost:80/?code=abcdef') geef, dan komt er keurig 'code=abcdef' in de caption te staan.
    Ligt het aan mij of aan Exact?
    Last edited by jthesing; 08-Jul-15 at 16:56.

  14. #14
    Quote Originally Posted by jthesing View Post
    Ligt het aan mij of aan Exact?
    Als je naar die auth-pagina gaat wat krijg je dan precies te zien na het inlogscherm?

    Moet je dan nog op authenticate ofzo drukken.

    Je zou die hele URL is in een externe browser op kunnen roepen. Uiteindelijk moet je dan een blanco pagina moeten krijgen. Als dat niet gebeurd dan moet er iets mis zijn bij de doorsturing in Exact.

    Overigens werkt jou caption= niet bij mij omdat hier direct nog een keer een "lege" ARequestInfo.Params.Text ontvangen wordt.

    Probeer eens een ShowMessage(ARequestInfo.Params.Text);

    Code:
    procedure Trommel.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      Showmessage(ARequestInfo.Params.Text);
    end;
    Overigens denk ik dat je die "redirect_uri=http://localhost:80" nog moet coderen. Want daar zou het ook mis kunnen gaan. (in de parameters)

    Je krijgt zo'n scherm??
    Click image for larger version. 

Name:	ijEjb4F.png 
Views:	297 
Size:	28.8 KB 
ID:	7051
    Last edited by rvk; 08-Jul-15 at 17:17.

  15. #15
    Hier zie ik dus dat je geen : i ndie url mag zetten:
    https://pypi.python.org/pypi/exactonline/0.1.2

    Dus je URL moet dit zijn:
    Code:
    https://start.exactonline.nl/api/oauth2/auth?
      client_id=%7Bxxxxx-xxxx-xxxx%7D&
      redirect_uri=https%3A//localhost:9090&
      response_type=code
    (waarschijnlijk ook nog met die clientsecret erbij denk ik maar die zie ik daar niet)

    Let dus ook op de %7B en %7D codering voor { en } en de %3A voor :

    (leuk puzzelen, hé )

Page 1 of 5 1 2 3 ... LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •