Bonjour, est ce que quelqu'un a déjà utilisé Delphi pour se connecter à Plat'au (rest) ?...
J'ai essayé, mais je n'y arrive pas. J'arrive via Postman... Mais mon débogueur rest Delphi ne veux pas... Merci d'avance pour toute aide...
Version imprimable
Bonjour, est ce que quelqu'un a déjà utilisé Delphi pour se connecter à Plat'au (rest) ?...
J'ai essayé, mais je n'y arrive pas. J'arrive via Postman... Mais mon débogueur rest Delphi ne veux pas... Merci d'avance pour toute aide...
Quelle version de Delphi utilises-tu ?
Et Plateau, c'est quoi ? C'est où ? Y a une doc ?
Plat'au est une plateforme dématérialisée pour les échanges de donnée d'urbanisme de l'Etat...
PLAT’AU utilise les standards actuels des webservices en proposant des services API en mode RESTFUL,
stateless, au standard Swagger2.0/OpenAPI 3.0 sur un formalisme REST/Json.
https://www.val-doise.gouv.fr/index....6+20200701.pdf
J'utilise différentes versions de Delphi : 10.1 ,10.2 11.1 ...
Quel que soit la version le débogueur rest donne le même échec...
salut
as tu verifier que les bibliotheques SSL sont correctement configuré chez toi ?
le plus simple est de mettre dans le repertoire de l'application ces dlls (libeay32.dll et ssleay32.dll)
il y a un exemple d'utilisation de REST en delphi, de souvenir cela ce nomme RestDemo
apres pour nous il est difficile de t'aider plus au vu du peu d'information que tu nous a fournis
Si ça fonctionne avec PostMan alors RestDebugger devrait fonctionner.
C'est certainement plus une mauvaise maitrise de ce programme qu'autre chose, à mon avis une histoire de paramètres ou authentification à saisir dans les onglets idoines
Merci à tous pour vos réponses.
Voici ce que j'ai dans Postman en autorisation pour obtenir un jeton :
Pièce jointe 637570
et ce j'ai avec le débogueur Rest de Delphi :
Pièce jointe 637571
Et si je fais le Step1:#Autorize
J'ai "Access Denied" en retour...
Alors que j'obtiens un jeton avec Postman avec ces valeurs...
...
Pour la prochaine fois, tu éviteras de montrer les Clients Credentials !
Même si les GUID sont tronqués sur le premier écran, sur le second c'est carrément en clair !
C'est loin d'être prudent, après tout OAuth2 c'est pour la sécurité et justement éviter l'une des plus grosses failles, l'échange de mot de passe non sécurisé.
Et les deux liens, même EntryPoint pour le Authorize que le Token, c'est étrange !
Aucun Scope ? juste openid
Ton token donc ne va pas servir à grand chose qu'a t'identifier, si l'API gère des routes et des accès restrictifs sur le scope, il va falloir étudier cela.
Ou alors c'est une API openbar ... en gros on colle du OAuth2 pour faire joli sans aucun cloisement derrière.
Tu devrais aussi vérifier pour utiliser la sandbox et non la prod
Pour un Client Credentials, tu n'as pas de Popup de Consentement à gérer mais faut que l'admin ait autorisé l'accès
En prod ça sera toujours du Client Credentials ou tu pourrais avoir du Auth Code avec un écran de consentement pour l'utilisateur + URI de Redirection pour récupérer le Auth Code et le transformer en Access Token + Refresh Token.
Authorize ce n'est pas la même chose qu'un Get Token
Il est tout à fait normal d'avoir une erreur, puisque Authorize permet d'avoir le popup de consentement HTML et de retourner le code à l'URI de Redirection
Mauvaise utilisation, mauvais fonctionnement.
L'assistant c'est uniquement pour le mode Auth Code
l'assistant fourni un navigateur Web intégré pour gérer le consentement
Inutile dans ton cas.
Pour le mode Client Credential, tu dois faire manuellement la requête POST, pas besoin de l'assistant pour cela
As-tu tenté un simple TRESTClient ?
J'obtiens par REST Debbuger la même chose, j'ai un doute sur pkGETorPOST vs pkRequestBody
uses
etCode:REST.Client, REST.Types, REST.Exception, REST.HttpClient,
Code:
1
2
3
4
5
6 // Dépendance du REST Standard Delphi : IPPeerCommon & IPPeerClient // Sans IPPeerCommon - EIPAbstractError : 'IPProcs is not defined. Make sure IPPeerCommon (or an alternative IP Implementation unit) is in the uses clause'. IPPeerCommon, // Sans IPPeerClient - EIPAbstractError : 'No peer with the interface with guid {E0125434-B354-482C-BD99-7E61623721FF} has been registered'. // TRESTHTTPProcs is implemented with IPPeerAPI. So, IPPeerClient must be used by the application in order to register the actual IPPeerAPI.IIPPeerProcs implementation. IPPeerClient,
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 var RESTClient: TRESTClient; RESTRequest: TRESTRequest; Source: TStringStream; ReponseContent: TStringStream; ClientID, ClientSecret, Token, Scope: string; begin ClientID := LowerCase('7BE0CC8D-D343-4D26-A9EF-FE0E31D35B33'); ClientSecret := LowerCase('ACD265BE-EEA1-4BE3-8F9A-E056A2C7F108'); Scope := 'openid'; RESTClient := TRESTClient.Create('https://sandbox-oauth.aife.economie.gouv.fr'); //RESTClient := TRESTClient.Create('https://sandbox-oauth.piste.gouv.fr'); //RESTClient := TRESTClient.Create('https://oauth.aife.economie.gouv.fr'); try RESTRequest := TRESTRequest.Create(RESTClient); // The Client owns the Request (will free it) and it will assign as Client property try RESTRequest.Method := TRESTRequestMethod.rmPOST; RESTRequest.Resource := '/api/oauth/token'; // grant_type=client_credentials&client_id=XXXX&client_secret=YYYYY&scope=openid // grant_type=client_credentials&client_id=7be0cc8d-d343-4d26-a9ef-fe0e31d35b33&client_secret=acd265be-eea1-4be3-8f9a-e056a2c7f108&scope=openid RESTRequest.Params.AddItem('grant_type', 'client_credentials', TRESTRequestParameterKind.pkGETorPOST); RESTRequest.Params.AddItem('client_id', ClientID, TRESTRequestParameterKind.pkGETorPOST); RESTRequest.Params.AddItem('client_secret', ClientSecret, TRESTRequestParameterKind.pkGETorPOST); RESTRequest.Params.AddItem('scope', Scope, TRESTRequestParameterKind.pkGETorPOST); RESTClient.ContentType := 'application/x-www-form-urlencoded'; // inutile c'est pkGETorPOST qui va permettre de calculer cette valeur RESTRequest.Execute; // 400 ! et ce retour n'est documenté nul part, si l'on omet un paramètre ça passe en 401 et en pkRequestBody ça passe en 403 if RESTRequest.Response.StatusCode = 200 then begin if RESTRequest.Response.GetSimpleValue('access_token', Token) then ShowMessage(Token) end else ShowMessage(Format('HTTP Response : %s (%d) %s', [RESTRequest.Response.StatusText, RESTRequest.Response.StatusCode, sLineBreak + RESTRequest.Response.Content])); except on E: Exception do ShowMessage('General Error ' + E.Message); on EHTTP: EHTTPProtocolException do ShowMessage('HTTP Error ' + EHTTP.Message); on EREST: ERESTException do ShowMessage('REST Error ' + EREST.Message); end; finally RESTClient.Free(); end; end;
Code:
1
2
3 [Content] HTTP Response : Bad Request (400) {"error":"invalid_client","error_description":"Client authentication failed (e.g. unknown client, no client authentication included, or unsupported authentication method). The authorization server MAY return an HTTP 401 (Unauthorized) status code to indicate which HTTP authentication schemes are supported. "}
Code:{"error":"invalid_client","error_description":"Client authentication failed (e.g. unknown client, no client authentication included, or unsupported authentication method). The authorization server MAY return an HTTP 401 (Unauthorized) status code to indicate which HTTP authentication schemes are supported. "}
Super Merci SaiLeTroll,
Les ID clients, ne pas les vrais j'ai mis des GUIDS bidons créés spécialement pour la capture d'écran...
Mercis pour tes infos !
Je vais contacter aussi l'assistance Plat'au s'ils peuvent me fournir plus d'infos.
Je reviendrais pour vous en dire plus sur la connexion quand elle sera ok.
Merci encore à toi et aux autres pour votre aide !
Bon week-end à tous!
Mikey.
Avec ce code et les bons GUID, cela devrait fonctionner !
Si ce n'est pas le cas, il y a un problème, tous les paramètres OAuth de la documentation PISTE sont fournies
J'utilise d'ailleurs un code similaire même si mieux écrit pour Azure, Google et Yahoo!
En gérant Auth Code pour tous ainsi que ROPC et Client Credentials pour Azure uniquement.
Hourra !
Un énorme merci à vous SaiLeTroll !
J'ai appliqué votre code : et Cela marche !!! :D
Bon maintenant il faut que passe les autre étapes :D
Merci et bonne journée.
Mikey