Page 3 of 5 FirstFirst 1 2 3 4 5 LastLast
Results 31 to 45 of 69

Thread: Exact online Oauth met Indy tidhttp

  1. #31
    Je zou deze routine eens kunnen proberen:
    (van hier: http://marc.durdin.net/2012/07/indy-...code-and-more/)

    Delphi Code:
    1. function EncodeURIComponent(const ASrc: string): UTF8String;
    2. const
    3.   HexMap: UTF8String = '0123456789ABCDEF';
    4.  
    5.   function IsSafeChar(ch: integer): Boolean;
    6.   begin
    7.     if (ch >= 48) and (ch <= 57) then Result := True // 0-9
    8.     else if (ch >= 65) and (ch <= 90) then Result := True // A-Z
    9.     else if (ch >= 97) and (ch <= 122) then Result := True // a-z
    10.     else if (ch = 33) then Result := True // !
    11.     else if (ch >= 39) and (ch <= 42) then Result := True // '()*
    12.     else if (ch >= 45) and (ch <= 46) then Result := True // -.
    13.     else if (ch = 95) then Result := True // _
    14.     else if (ch = 126) then Result := True // ~
    15.     else Result := False;
    16.   end;
    17.  
    18. var
    19.   I, J: integer;
    20.   ASrcUTF8: UTF8String;
    21. begin
    22.   Result := ''; { Do not Localize }
    23.  
    24.   ASrcUTF8 := UTF8Encode(ASrc);
    25.   // UTF8Encode call not strictly necessary but
    26.   // prevents implicit conversion warning
    27.  
    28.   I := 1;
    29.   J := 1;
    30.   SetLength(Result, Length(ASrcUTF8) * 3); // space to %xx encode every byte
    31.   while I <= Length(ASrcUTF8) do
    32.   begin
    33.     if IsSafeChar(Ord(ASrcUTF8[I])) then
    34.     begin
    35.       Result[J] := ASrcUTF8[I];
    36.       Inc(J);
    37.     end
    38.     else if ASrcUTF8[I] = ' ' then
    39.     begin
    40.       Result[J] := '+';
    41.       Inc(J);
    42.     end
    43.     else
    44.     begin
    45.       Result[J] := '%';
    46.       Result[J + 1] := HexMap[(Ord(ASrcUTF8[I]) shr 4) + 1];
    47.       Result[J + 2] := HexMap[(Ord(ASrcUTF8[I]) and 15) + 1];
    48.       Inc(J, 3);
    49.     end;
    50.     Inc(I);
    51.   end;
    52.  
    53.   SetLength(Result, J - 1);
    54. end;

  2. #32
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Als ik de code tussen haken zet krijg ik een 500 internal server error. In ieder geval geen bad request meer.

    O nee, als ik het nog eens probeer komt r weer een bad request.

  3. #33
    Quote Originally Posted by jthesing View Post
    Als ik de code tussen haken zet krijg ik een 500 internal server error. In ieder geval geen bad request meer.
    Ik denk niet dat dat "beter" is

    Volgens mij is een bad request beter om te krijgen. Want dan weet je dat de aanvraag wel goed is maar dat of de code niet goed is of iets anders verkeerds opgegeven is.
    (met een 500 internal server error kun je helemaal niets)

    Had je die code wel elke keer weer opnieuw aangevraagd?
    (ik weet niet of je die laatste post op de vorige pagina gezien had).
    De authenticatie-code is maar zeer beperkt geldig.
    Die moet je dus niet opslaan en elke keer in je testen opnieuw gebruiken.

    (begin me weer langzaam te herinneren waarom ik Indy haat )

  4. #34
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Ja, iedere keer dat ik een token aanvraag doe ik eerst een code aanvraag. Met de haakjes [] om de code krijg ik een internal server error en zonder een bad request. Met de functie EncodeURIComponent wordt het helaas niet beter of slechter..
    Het is inderdaad allemaal erg ondoorzichtig wat er gebeurt, welke componenten gebruik jij?

  5. #35
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Zal ik je anders het project opsturen?

  6. #36
    Ik denk iets gevonden te hebben.

    Als ik een POST doe naar een http site (ik kan https niet afvangen met wireshark ) dan zie ik het volgende vanuit indy:

    Code:
    &redirect_uri=http%253a%252f%252flocalhost%253a80
    Jouw encoded URL is dit:
    Code:
    &redirect_uri=http%3a%2f%2flocalhost%3a80
    Wat mij dus opvalt is dat indy DUBBEL encoding doet.

    Er zit in je IdHTTP component een property HTTPOptions.
    Zet daarin de hoForceEncodeParams eens uit !!!


    Quote Originally Posted by jthesing View Post
    Zal ik je anders het project opsturen?
    Als bovenstaand niet lukt kun je inderdaad de source eens sturen. Dan kan ik nog eens proberen af te vangen met wireshark en zien of er nog iets anders mis gaat.
    Last edited by rvk; 09-Jul-15 at 14:33.

  7. #37
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Het is gelukt!
    Er moesten 3 dingen worden aangepast:
    - In de params.text moeten alle CRLF's worden vervangen door '&'
    - De client id moet tussen accolades {} en de client-secret niet (waarom is mij volstrekt niet duidelijk). Dit wijkt dus af van het voorbeeld van Exact.
    - Inderdaad, de hoForceEncodeParams moet uitgezet worden.
    Weer heel erg bedankt, Rik, helemaal te gek dat je me zo op weg helpt!

  8. #38
    Quote Originally Posted by jthesing View Post
    Het is gelukt!
    Yeeeeeeeeeee

    Quote Originally Posted by jthesing View Post
    - In de params.text moeten alle CRLF's worden vervangen door '&'
    Dat zou ook al intern door indy gedaan moeten worden. Ik zie in ieder geval dat dat intern wel gedaan wordt (in WireShark). Dus waarschijnlijk is die stap niet nodig. (Die andere 2 ({} en hoForceEncodeParams weghalen zijn dus wel nodig.)

    Fijn dat het nu werkt.

  9. #39
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Quote Originally Posted by rvk View Post
    Yeeeeeeeeeee


    Dat zou ook al intern door indy gedaan moeten worden. Ik zie in ieder geval dat dat intern wel gedaan wordt (in WireShark). Dus waarschijnlijk is die stap niet nodig. (Die andere 2 ({} en hoForceEncodeParams weghalen zijn dus wel nodig.)

    Fijn dat het nu werkt.
    Ik durf het bijna niet te vragen maar.. Nu heb ik een token, maar kan ik nergens vinden hoe ik die moet gebruiken! Als ik een eenvoudig post commando geef om een relatie toe te voegen in exact krijg ik een unauthorized message. Kun jij me weer een beetje op weg helpen, Rik?

  10. #40
    Quote Originally Posted by jthesing View Post
    Ik durf het bijna niet te vragen maar..
    Hihihi Ja... je rolt van het één in het ander...

    Welke code gebruik je nu om een relatie toe te voegen?
    (welke url e.d. en csv, xml of iets anders?)

    (dat zoekt wat makkeljker want ik ben wel wat voorbeelden tegengekomen.)

  11. #41
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Fijn dat je nog even wilt helpen..
    Ik dacht een post te doen met de volgende url:
    https://start.exactonline.nl/api/docs/CrmAccountsImport.aspx?service=1&csvcolumns=NAME,P ostcode,City&delimiter=,&access_token=gAAAAB.....O 84GJcbJUw&client_id={eb3987e5-9a26-4793-afb1-0cfafd5db5ce}&clientsecret=DEhMY9G6HsR6
    Als parameter stuur ik een stringlist mee waarin ik het csv bestand heb gestopt. Het csv bestand ziet er als volgt uit:
    naam,postcode,woonplaats
    Demo,1111AA,Amsterdam

    Het gekke is dat ik nergens in de help van Exact ook maar iets kan vinden over hoe je de token gebruikt... En ook niet bij de API van Google, die er vrijwel identiek uit ziet, volgens Exact.

  12. #42
    Ik zie dat je voor 1 augustus wel om moet zijn
    Important notice for existing API integrations. Please make sure you migrate to Stateless and OAuth security standards before the 1st of August 2015.
    Op de site van exact kom ik voor de omschakeling op de volgende pagina:
    https://developers.exactonline.com/#..._standards.htm

    Ik zie dat je straks ook de Division mee moet geven:
    Todditionally Exact Online and the App Center will no longer support Stateful API calls. To keep using any of our APIs, you must create Stateless API calls that include the division code in the URI.
    Dus: https://developers.exactonline.com/#..._code_API.html

    Hier trouwens ook een topic over Exact Online maar ik denk niet dat dat in compinatie met OAuth2 is:
    http://www.nldelphi.com/showthread.p...gaat-niet-goed

    Ok... je kunt inderdaad niet veel vinden over wat je nu bij Exact Online mee moet geven voor de CSV Apis. Ik denk overigens sowieso niet dat je de client_id & clientsecret mee hoeft te geven want die zijn alleen voor het aanvragen van de tokens.

    Code:
    https://start.exactonline.nl/api/docs/CrmAccountsImport.aspx?
      service=1&
      csvcolumns=NAME,Postcode,City&
      delimiter=,&
      access_token=gAAAAB.....O 84GJcbJUw&
      _Division_=4293
    Er staan in de access_token geen speciale tekens ??? (anders moet je die ook weer encoden )

  13. #43
    Arrrrggg.... het zou ook nog anders kunnen zijn...

    Ik denk niet dat je de access_token mee moet geven in de URL.
    Je moet hem meegeven in de headers als
    Code:
    Authorization: Bearer 0b79bab50daca910b000d4f1a2b675d604257e42
    Dus probeer is de normale kale URL voor de POST maar die Authorization aan de headers toe te voegen.
    Code:
    MyHttp.Request.CustomHeaders.Add('Authorization: Bearer '+ access_token;

    Ik had het kunnen weten want dit ben ik voor Google vroeger ook tegengekomen.

    Ik weet alleen even niet meer of die access_token nog base64 moest zijn of niet. (er staat me zoiets bij maar dat zou ik even na moeten kijken).

  14. #44
    Member
    Join Date
    May 2001
    Location
    Hoofddorp
    Posts
    40
    Om te beginnen: ik had mijn basicauthentication aanstaan , daarom kreeg ik een autorization error.
    Die heb ik uitgezet en vervolgens de post gedaan die er uitziet zoals eerder gemeld. In ieder geval gaat de post verder, maar ik krijg een onbegrijpelijke response:

    #$1F'?'#8#0#0#0#0#0#4#3'?UKS?8'#$10'>''U?'#$F'B'# (en dat gaat nog zo'n 100 regels door).

    Toen heb ik jouw methode geprobeerd. Die loopt ook door, maar de response is nu leeg, terwijl ik iets van een 'ok' zou moeten krijgen.

    Heb gekeken in mijn test administratie bij de stamgegevens van de relaties, maar er is geen relatie toegevoegd.

    De url ziet er als volgt uit:
    https://start.exactonline.nl/api/doc...cfafd5db5ce%7D

    en de stringlist: (1 regel) demo,teststraat,amsterdam,1

  15. #45
    Ik neem aan dat je ook elke keer weer een nieuwe access_token aanmaakt (want die zijn maar 10 minuten geldig).

    Je moet inderdaad geen basicauthentication gebruiken maar Authorization: Bearer (zoals ik in mijn laatste post aangaf). Die pagina die jij noemt komt n.l. met een loginscherm. En aangezien het dus geen basic authenticatie is zal het wel die Bearer moeten zijn.
    (zie ook http://stackoverflow.com/a/18752897/1037511)

    Had je die MyHttp.Request.CustomHeaders.Add('Authorization: Bearer '+ access_token; al geprobeerd.

    Je hebt die client_id nog in je URL staan. Haal die er ook eens uit. En had je ook een division of niet?

    Code:
    https://start.exactonline.nl/api/docs/CrmAccountsImport.aspx?
      service=1&
      csvcolumns=Name,Addressline1,city,iscustomer&
      delimiter=,&
      _division_=1234
    samen met
    Code:
    MyHttp.Request.CustomHeaders.Add('Authorization: Bearer '+ access_token;
    Wat ik van die "#$1F'?'#8#0#0#0#0#0#4#3'?UKS?8'#$10'>''U?' #$F'B'#" moet maken weet ik ook niet precies. Waarschijnlijk is dat het gevolg van zonder authenticatie die pagina proberen op te roepen. Dan krijg je dus troep.

    Zijn de regels die je doorzet naar Exact overigens ASCII of Unicode ?
    Met welke Delphi werkte je?

    (Je zou natuurlijk morgen even aan Exact kunnen vragen of de access_token mee moet in de URL bij CSV of dat ie als Authentication regel in de header moet.)

Page 3 of 5 FirstFirst 1 2 3 4 5 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
  •