Wel apart dat ik met exact dezelfde code (alleen de uri en de login gegevens zijn anders uiteraard) met de Asana API wel netjes een token terug krijg, alleen bij Exact gaat het mis.
Wel apart dat ik met exact dezelfde code (alleen de uri en de login gegevens zijn anders uiteraard) met de Asana API wel netjes een token terug krijg, alleen bij Exact gaat het mis.
Blijkbaar accepteert de server van Asana wel een URL met parameters (en hoef je daar waarschijnlijk niet eens een POST te doen.
Maar bij exact zeggen ze
Dus is het heel duidelijk dat je de data via een form-urlencoded POST moet (met data dus) doen.POST ../api/oauth2/token with post data:
(Post data should be x-www-form-urlencoded)
Hier staan een paar code snippets hoe je dat met Indy zou moeten doen.
(eerst je data dus naar een stream schrijven en dan naar die URL posten)
http://www.delphipraxis.net/172189-o...s-synapse.html
(ik gebruik daar standaard Synapse voor)
Ik heb de code aangepast, maar krijg nu als response iets onleesbaars terug: " lRmo0"
De code:
Delphi Code:
var http: thttpsend; response: string; params : String; A: TStringStream; begin Params := ''; Params := Params + 'code=' + EncodeURLElement(e_ReceiveCode.Text); Params := Params + '&redirect_uri=' + EncodeURLElement(s_Exact_Redirect_EP); Params := Params + '&grant_type=' + EncodeURLElement('authorization_code'); Params := Params + '&client_id={' + EncodeURLElement(s_Exact_Ident); Params := Params + '}&client_secret=' + EncodeURLElement(s_Exact_Secret); http := THttpsend.Create; http.Protocol := '1.1'; http.UserAgent := 'DotNetOpenAuth/3.4.6.10357'; http.Document.position := 0; writestrtostream(http.Document, Params); http.Document.position := 0; http.MimeType := 'application/x-www-form-urlencoded; charset=utf-8'; http.HTTPMethod('POST', s_Exact_Token_EP); http.Document.position := 0; response := readstrfromstream(http.Document, http.Document.Size); memo_return.Lines.Add(response); end;
Zou dat gz formaat kunnen zijn dat niet automatisch door Indy omgezet wordt?
O wacht... en waar is je SSL handler voor HTTPS?
Ik neem aan dat die URL een https bevat?
Dan moet je dus ook nog iets hebben als:
Delphi Code:
HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
Hmmm, ik heb jouw code geprobeerd, maar ik krijg hetzelfde resultaat.
De exactCode:lRmo0['
Delphi Code:
Var Params : String; AsanaOauthHttp : THTTPSend; Response : TMemoryStream; begin Memo_Return.Clear; Params := ''; Params := Params + 'code=' + EncodeURLElement(e_ReceiveCode.Text); Params := Params + '&redirect_uri=' + EncodeURLElement(s_Exact_Redirect_EP); Params := Params + '&grant_type=' + EncodeURLElement('authorization_code'); Params := Params + '&client_id={' + EncodeURLElement(s_Exact_Ident); Params := Params + '}&client_secret=' + EncodeURLElement(s_Exact_Secret); Response := TMemoryStream.Create; try if HttpPostURL(s_Exact_Token_EP, Params, Response) then begin Response.Position := 0; Response.SaveToFile('c:\RSJ\rsjresponse.txt'); Memo_Return.Lines.LoadFromFile('c:\RSJ\rsjresponse.txt'); ShowMessage('fout opgetreden'); end; Finally Response.Free; screen.cursor:=crDefault; End; // End Try end;
En wat staat er in HttpPostURL?
Is dat van Indy of van Synapse.
Ik mis hier nog steeds de initialisatie van HTTPS (als dit Indy is).
En als het Synapse is, heb je dan ssl_openssl in je uses opgenomen?
Anders wordt openssl niet genitialiseerd en werkt de https niet goed.
Dit is Synapse, Indy heb ik een aantal maanden geleden hevig mee gestoeid, en kreeg zaken niet voor elkaar die met Synapse binnen 5 minuten werkend waren. Dus mijn voorkeur gaat uit naar Synapse. Vandaar dat ik jou code heb gebruikt.
Ja ssl_openssl heb ik in Uses staan.
Voor s_Exact_Token_EP heb ik ook verschillende zaken geprobeerd:
ens_Exact_Token_EP :='https://start.exactonline.nl/api/oauth2/token';
s_Exact_Token_EP :='https://start.exactonline.nl/api/oauth2/token?';
Kun je de ontvangen headers na de POST uitlezen?
Hoe zijn die?
En zonder de { } om de client_id?
Met of zonder de {} maakt geen verschil.
Dit staat er in de response file:
lRmo0['tt@RU+{hXNf_yJ:Qr'W_ 2n19^~ eB_ˈʈzB/8Е5!3UR][Cep0ԅu2-8>jEM%zԳG!bH2
H=*HR P+AB
u!sXC,IS ;aݚvz!Us+##.\,e~*NgIK
+$#a^H,tҨs]ݚKSkdW4j
(~v+w/]pyd2qxY(3Էq`G{*[`!5*:n-Sʢip{3D_\YhzS!wu!vi} Xޫ3ini\F,T1$W&(RY#gcTQ ΘZUzM Deҳx<x"B*[D2Ui7vD@P*DJliJ'ܡ&}3. ̔kz%G?iTVNmwva0pCq aBH&x-|AobLyf$[5A`zsM5oGr~W
En de headers?
En wat als je bewust een verkeerde Authentication code voor code gebruikt?
Er wordt geen Accept-Encoding meegezonden maar de server zou best eens kunnen beslissen om gzip terug te sturen.
Dit zou je aan de headers moeten kunnen zien.
Als je het resultaat in een hex-editor bekijkt... wat zijn dan de eerste 2 bytes?
0x1f8b staat voor gz formaat.
Voor de headers:
Delphi Code:
var Params: String; HTTP: THTTPSend; begin Params := ''; Params := Params + 'code=' + EncodeURLElement('code'); Params := Params + '&redirect_uri=' + EncodeURLElement('uri'); Params := Params + '&grant_type=' + EncodeURLElement('authorization_code'); Params := Params + '&client_id=' + EncodeURLElement('client_id'); Params := Params + '&client_secret=' + EncodeURLElement('client_secret'); HTTP := THTTPSend.Create; try WriteStrToStream(HTTP.Document, Params); // wordt automisch ansistring HTTP.MimeType := 'application/x-www-form-urlencoded'; if HTTP.HTTPMethod('POST', s_Exact_Token_EP) then begin HTTP.Document.Position := 0; Memo_Return.Lines.LoadFromStream(HTTP.Document); Memo_Return.Lines.Add(HTTP.Headers.Text); end; finally HTTP.Free; end; end;
Met een foute code krijg ik bad request terug als response.
Ik begrijp niet helemaal wat je bedoeld met de header
Dit is met Indy volgens mij, klopt dat??
Ik had al een stukje code geplaatst om de header uit te lezen.
Nee, dit is voor Synapse.
Verder vraag ik mij af wat de twee eerste bytes zijn in jouw response file.
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks