Comment obtenir un jeton pour utiliser dans vos appels API
- Un jeton est associé à un utilisateur d’EPC. Pour générer un jeton pour un utilisateur, vous avez besoin de son nom d’utilisateur et de son mot de passe.
- Lorsqu’un jeton est généré, il est également lié à une session dans EPC. Si la session est terminée, le jeton deviendra invalide. Une session se terminera également automatiquement après le délai de SESSION_TIMEOUT, trouvé dans la section Admin Système. Cela peut être modifié (en minutes) dans l’onglet Avancé. Notez que votre utilisateur doit avoir des droits d’administration système pour accéder à cette section.
Une session peut être terminée manuellement dans la boîte ‘Gérer les sessions EPC’, dans l’onglet Général, en cliquant sur la corbeille à côté de la session que vous souhaitez fermer.
Un jeton contient également une date d’expiration indépendante d’une session. Vous pouvez la modifier en éditant le paramètre WEBTOKEN_EXPIRES_IN dans la section Admin Système (en jours).
- Appelez un service avec ces informations pour obtenir un jeton valide. Pour obtenir un jeton, vous devez envoyer une requête POST à l’URL https://VOTREEPC.interfacing.com/api/v1/login/local avec un corps JSON contenant le nom d’utilisateur et le mot de passe.
- Dans la réponse, il y aura un cookie nommé access_token. Vous pouvez soit utiliser ce cookie pour tous les appels API ultérieurs, soit utiliser le jeton en tant que jeton Bearer en utilisant l’en-tête de requête http Authorization standard.
Voici un exemple de cet échange :
15:35:15.889 request :
1 > POST https://localhost/login/local
1 > Content-Type: application/json; charset=UTF-8
1 > Content-Length: 45
1 > Host: localhost
1 > Connection: Keep-Alive
1 > User-Agent: Apache-HttpClient/4.5.13 (Java/11.0.15)
1 > Accept-Encoding: gzip,deflate
{
"password": "Passw0rd",
"username": "myecpuser"
}
15:35:16.011 temps de réponse en millisecondes : 122
1 < 302
1 < Date: Wed, 08 Jun 2022 19:35:16 GMT
1 < Content-Type: text/plain; charset=utf-8
1 < Content-Length: 23
1 < Connection: keep-alive
1 < Cache-Control: no-store
1 < Set-Cookie: [loginsuccess=true; Path=/, access_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...; Expires=Thu, 01 Jan 1970 00:00:00 GMT]
1 < Location: /
1 < Vary: Accept
1 < Age: 0
1 < Via: 1.1 varnish (Varnish/7.1)
1 < X-Frame-Options: SAMEORIGIN
1 < X-XSS-Protection: 1; mode=block
1 < X-Content-Type-Options: nosniff
1 < Referrer-Policy: no-referrer-when-downgrade
1 < Content-Security-Policy: default-src 'self' http: https: data: blob: 'unsafe-inline' 'unsafe-eval'
1 < Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
1 < X_SRV: EPC
Exemple Curl
curl --request POST --url 'https://epcdev.interfacing.com/login/local' --header 'Content-Type: application/json' --data '{"username": "myecpuser", "password": "Passw0rd"}' -c /tmp/cookie.tmp
Code d’exemple JAVA utilisant Spring Boot:
package com.interfacing.epc.sync.bpc.client;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseCookie;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;
import com.interfacing.epc.sync.util.WebClientUtils;
@Configuration
@RequiredArgsConstructor
@Slf4j
public class BpcWebClient {
private final WebClient.Builder webClientBuilder;
@Value("${bpc.baseUrl}")
private String baseUrl;
@Value("${bpc.username}")
private String username;
@Value("${bpc.password}")
private String password;
@Value("${bpc.wiretap}")
private boolean wiretap;
@Bean
public WebClient bpcClient() {
WebClient.Builder clientBuilder = webClientBuilder.baseUrl(baseUrl + "/api/v1").defaultHeader(HttpHeaders.AUTHORIZATION, authorization());
log.debug("BPC client created");
return WebClientUtils.build(clientBuilder, this.getClass().getPackageName() + ".bpcClient", wiretap);
}
private String authorization() {
WebClient.Builder clientBuilder = webClientBuilder.clone().baseUrl(baseUrl + "/login/local");
Optional<ResponseCookie> s = WebClientUtils.build(clientBuilder, this.getClass().getPackageName() + ".authorization", wiretap)
.post()
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(new LoginRequest(username, password)))
.exchangeToMono(r -> Mono.justOrEmpty(r.cookies().getFirst("access_token")))
.blockOptional();
if (s.isPresent())
{
return "Bearer " + s.get().getValue();
}
else
{
throw new ApplicationContextException("Invalid username/password for BPC");
}
}
}
Laissez votre avis sur ce sujet.