Vous devriez déjà avoir modifié votre code pour ne plus utiliser les `RestTemplate`.
Cette section est conservée à but documentaire, en principe vous devriez pouvoir passer à la partie suivante directement.
Cette section est conservée à but documentaire, en principe, vous devriez pouvoir passer à la partie suivante directement : <<_http_interfaces>>.
====
Nous devons également modifier notre usage du `RestTemplate` pour utiliser l'authentification.
...
...
@@ -352,7 +352,7 @@ Pour utiliser une authentification basique sur une _HTTP Interface_ Spring, il f
Un exemple est présent dans la https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#_creating_a_restclient[documentation de Spring].
Dans la classe qui configure vos _HTTP Interfaces_, recevez en injection de dépendance le `user` et `password` de l'API Trainers, avec `@Value`, et utilisez ces valeurs pour générer un header.
Dans la classe qui configure vos _HTTP Interfaces_, recevez en injection de dépendance le `user` et `password` de l'API Trainers, avec `@Value`, et utilisez ces valeurs pour générer un header Http avec la méthode `HttpHeaders.encodeBasicAuth()`. Injectez votre header dans le RestClient avec la méthode `requestInitializer` du `RestClient.Builder`.
== Sécuriser `game-ui` avec un accès OpenID Connect
Les properties possibles sont détaillées dans https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html[la doc de Spring Security]
Pour activer l'utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un `SecurityFilterChain` utilisant l'authentification OIDC.
Pour activer l'utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un `SecurityFilterChain` utilisant l'authentification OIDC, avec la méthode `oauth2Login()`.
Reportezvous à https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean[cet exemple] de la documentation de Spring Security :
Reportez-vous à https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean[cet exemple] de la documentation de Spring Security :
[source,java]
.OAuth2LoginSecurityConfig.java
...
...
@@ -475,7 +475,6 @@ Il est possible de détecter la connexion en customisant l'appel à `oauth2Login
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(Customizer.withDefaults())
.authorizeHttpRequests(authorize -> {
authorize.anyRequest().authenticated();
})
...
...
@@ -493,9 +492,9 @@ Implémentez l'appel à l'API Trainer, qui vérifie si un Trainer existe déjà
Nous souhaitons créer une page "Mon profil" pour nos dresseurs de Pokemon.
Sur cette page, ils pourraient lister leurs pokemons.
Sur cette page, ils pourraient lister leurs Pokemons.
Cette page pourrait être disponible à l'url http://localhost:9000/profile[,window="_blank"] et ressembler à ça :
Cette page pourrait être disponible à l'URL http://localhost:9000/profile[,window="_blank"] et ressembler à ça :
.La page profil de Sacha
image::images/ash_profile.png[]
...
...
@@ -651,7 +650,7 @@ Vous pouvez créer une barre de navigation pour votre application, qui affiche l
== Pour aller plus loin
* implémentez un flow d'inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ)
* implémentez un flow d'inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ) :
** dans le `successHandler` du customizer du `.oauth2Login`, il est possible de faire des `response.sendRedirect` pour rediriger l'utilisateur sur une page précise après son login
* une fois un joueur connecté, il peut choisir l'un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ.
* une fois un joueur connecté, il peut choisir l'un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ, s'il ne possède pas encore de Pokémon dans son équipe
* la dernière étape de son inscription consiste à faire un `POST` sur l'API Trainers, pour modifier le Trainer du joueur en base de données.
@@ -1005,7 +1052,7 @@ En particulier sur le <code>game-ui</code>.</p>
<tdclass="content">
<divclass="paragraph">
<p>Vous devriez déjà avoir modifié votre code pour ne plus utiliser les <code>RestTemplate</code>.
Cette section est conservée à but documentaire, en principe vous devriez pouvoir passer à la partie suivante directement.</p>
Cette section est conservée à but documentaire, en principe, vous devriez pouvoir passer à la partie suivante directement : <ahref="#_http_interfaces">HTTP Interfaces</a>.</p>
</div>
</td>
</tr>
...
...
@@ -1038,70 +1085,71 @@ Hé ! On pourrait faire pareil pour transmettre la <code>Locale</code> de notre
@@ -1204,7 +1254,7 @@ Il faut indiquer à spring quel <code>RestTemplate</code> sélectionner lorsqu&#
<p>Un exemple est présent dans la <ahref="https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#_creating_a_restclient">documentation de Spring</a>.</p>
</div>
<divclass="paragraph">
<p>Dans la classe qui configure vos <em>HTTP Interfaces</em>, recevez en injection de dépendance le <code>user</code> et <code>password</code> de l’API Trainers, avec <code>@Value</code>, et utilisez ces valeurs pour générer un header.</p>
<p>Dans la classe qui configure vos <em>HTTP Interfaces</em>, recevez en injection de dépendance le <code>user</code> et <code>password</code> de l’API Trainers, avec <code>@Value</code>, et utilisez ces valeurs pour générer un header Http avec la méthode <code>HttpHeaders.encodeBasicAuth()</code>. Injectez votre header dans le RestClient avec la méthode <code>requestInitializer</code> du <code>RestClient.Builder</code>.</p>
</div>
</div>
</div>
...
...
@@ -1272,15 +1322,15 @@ Prenez note de l'<em>Application ID</em> et du <em>Secret</em> qui vous sont don
<p>Les properties possibles sont détaillées dans <ahref="https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html">la doc de Spring Security</a></p>
</div>
<divclass="paragraph">
<p>Pour activer l’utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un <code>SecurityFilterChain</code> utilisant l’authentification OIDC.</p>
<p>Pour activer l’utilisation de OAuth2 / OIDC, il faut personnaliser la configuration de Spring Boot, pour y enregistrer un <code>SecurityFilterChain</code> utilisant l’authentification OIDC, avec la méthode <code>oauth2Login()</code>.</p>
</div>
<divclass="paragraph">
<p>Reportezvous à <ahref="https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean">cet exemple</a> de la documentation de Spring Security :</p>
<p>Reportez-vous à <ahref="https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-provide-securityfilterchain-bean">cet exemple</a> de la documentation de Spring Security :</p>
<spanclass="tok-c1">// create a Trainer here if it does not exists</span>
<spanclass="tok-n">System</span><spanclass="tok-p">.</span><spanclass="tok-na">out</span><spanclass="tok-p">.</span><spanclass="tok-na">println</span><spanclass="tok-p">(</span><spanclass="tok-n">authentication</span><spanclass="tok-p">.</span><spanclass="tok-na">getName</span><spanclass="tok-p">()</span><spanclass="tok-o">+</span><spanclass="tok-s">" is connected !"</span><spanclass="tok-p">);</span>
<spanclass="c1">// create a Trainer here if it does not exists</span>
<spanclass="nc">System</span><spanclass="o">.</span><spanclass="na">out</span><spanclass="o">.</span><spanclass="na">println</span><spanclass="o">(</span><spanclass="n">authentication</span><spanclass="o">.</span><spanclass="na">getName</span><spanclass="o">()</span><spanclass="o">+</span><spanclass="s">" is connected !"</span><spanclass="o">);</span>
@@ -1425,10 +1474,10 @@ Cette partie est moins guidée. Reportez-vous au cours !
<p>Nous souhaitons créer une page "Mon profil" pour nos dresseurs de Pokemon.</p>
</div>
<divclass="paragraph">
<p>Sur cette page, ils pourraient lister leurs pokemons.</p>
<p>Sur cette page, ils pourraient lister leurs Pokemons.</p>
</div>
<divclass="paragraph">
<p>Cette page pourrait être disponible à l’url<ahref="http://localhost:9000/profile"class="bare"target="_blank"rel="noopener">http://localhost:9000/profile</a> et ressembler à ça :</p>
<p>Cette page pourrait être disponible à l’URL<ahref="http://localhost:9000/profile"class="bare"target="_blank"rel="noopener">http://localhost:9000/profile</a> et ressembler à ça :</p>
</div>
<divclass="imageblock">
<divclass="content">
...
...
@@ -1483,60 +1532,61 @@ C’est plus propre que de faire de l’héritage :)</p>
@@ -1711,7 +1763,7 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les
<divclass="ulist">
<ul>
<li>
<p>implémentez un flow d’inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ)</p>
<p>implémentez un flow d’inscription au jeu (vous pouvez réutiliser la page 'register' du TP 5 comme point de départ) :</p>
<divclass="ulist">
<ul>
<li>
...
...
@@ -1721,7 +1773,7 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les
</div>
</li>
<li>
<p>une fois un joueur connecté, il peut choisir l’un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ.</p>
<p>une fois un joueur connecté, il peut choisir l’un des 3 Pokemons starter (id 1, 4, ou 7) pour constituer son équipe de départ, s’il ne possède pas encore de Pokémon dans son équipe</p>
</li>
<li>
<p>la dernière étape de son inscription consiste à faire un <code>POST</code> sur l’API Trainers, pour modifier le Trainer du joueur en base de données.</p>
...
...
@@ -1733,7 +1785,7 @@ En particulier le token <code>CSRF</code> dont nous aurons besoin pour tous les