J'ai une configuration Boot Spring assez basique et j'ai installé Spring Security et j'ai réussi à mettre en place avec succès OAuth2 pour protéger mon API.
J'ai eu quelques problèmes quelques jours en arrière et demandé (et répondu) une question en ce qui concerne frapper mon /oauth/token
point final. Je me suis vite compris que le problème était que je tentais d'envoyer mes lettres de créance clients dans le corps de ma POST
demande , mais le point final jeton est configuré dans Spring Security pour accepter les informations d' identification du client ( client_id
et secret
) via HTTP Basic Auth à la place.
La plupart de mon expérience avec la consommation API OAuth2 a consisté à envoyer des informations d' identification des clients dans le corps de la POST
demande et je me demandais s'il était possible de configurer Spring Security pour fonctionner de la même manière?
J'ai essayé quelques choses différentes sans succès, comme définissant l'option de configuration suivante, mais je me sens comme ça peut être utilisée que lors de la configuration d'un client OAuth2:
security.oauth2.client.clientAuthenticationScheme=form
Ceci est ma configuration de serveur d'autorisation.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.approval.UserApprovalHandler;
import org.springframework.security.oauth2.provider.token.TokenStore;
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private TokenStore tokenStore;
@Autowired
private UserApprovalHandler userApprovalHandler;
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client_id")
.secret("secret")
.authorizedGrantTypes("password", "authorization_code", "refresh_token")
.scopes("read", "write")
.accessTokenValiditySeconds(600)
.refreshTokenValiditySeconds(3600);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(this.tokenStore)
.userApprovalHandler(this.userApprovalHandler)
.authenticationManager(this.authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
security.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()")
.passwordEncoder(this.passwordEncoder);
}
}
Comme l' a souligné @chrylis dans les commentaires, l'astuce consiste à utiliser la allowFormAuthenticationForClients
méthode sur AuthorizationServerSecurityConfigurer
la configuration du serveur d'autorisation. Dans mon cas, j'ai dans ma AuthorizationServerConfig
classe:
@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
security.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()")
.passwordEncoder(this.passwordEncoder)
.allowFormAuthenticationForClients();
}
Cela permettra à des informations d' identification de client en passant par des paramètres standard, comme dans le corps de la POST
demande (ou dans la chaîne de requête), bien que Spring préfère en utilisant HTTP Basic Auth en se joignant au client_id
et secret
avec deux points ( <client_id>:<secret>
), base 64 codant pour le résultat , préfixer avec Basic
et en passant que l' en- Authorization
tête, vous donc se retrouver avec quelque chose comme ceci:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots