Printemps De Sécurité OAuth2 Serveur De Ressources Revenant Toujours Invalid Token
Je suis en train d'essayer d'obtenir une base en mémoire OAuth2 serveur en cours en utilisant le Printemps des Bibliothèques. J'ai été à la suite de la sparklr exemple.
Actuellement j'ai configuré le Serveur et presque tout fonctionne, cependant je ne peux pas accéder à mon limité de ressources du serveur de ressources.
Mon flux de travail de test:
- Accès oauth autorisé URI pour démarrer le OAuth2 flux: http://localhost:8080/server/oauth/authorize?response_type=code&client_id=client
- Rediriger vers la page de connexion: http://localhost:8080/server/login
- Poignée de l'approbation et de la rediriger vers mon configuré page de redirection w/un code de paramètre: http://localhost:8080/client?code=HMJO4K
- Construire une requête GET à l'aide de l'Authentification Basique à l'aide de l'id du client et secret avec le type de subvention et code: http://localhost:8080/server/oauth/token?grant_type=authorization_code&code=HMJO4K
- Recevoir un access_token et jeton d'actualisation de l'objet en retour
{
access_token: "f853bcc5-7801-42d3-9cb8-303fc67b0453"
token_type: "au porteur"
refresh_token: "57100377-dea9-4df0-adab-62e33f2a1b49"
expires_in: 299
champ d'application: "lecture-écriture"
} - Tentative d'accès à une ressource soumise à restriction à l'aide de l'access_token: http://localhost:8080/server/me?access_token=f853bcc5-7801-42d3-9cb8-303fc67b0453
- Recevoir une défaillance de jeton de répondre
{
erreur: "invalid_token"
error_description: "Invalid jeton d'accès: f853bcc5-7801-42d3-9cb8-303fc67b0453"
} - POST pour le jeton uri de nouveau pour rafraîchir jeton: http://localhost:8080/server/oauth/token?grant_type=refresh_token&refresh_token=57100377-dea9-4df0-adab-62e33f2a1b49
- Recevoir un nouveau jeton
{
access_token: "ed104994-899c-4cd9-8860-43d5689a9420"
token_type: "au porteur"
refresh_token: "57100377-dea9-4df0-adab-62e33f2a1b49"
expires_in: 300
champ d'application: "lecture-écriture"
}
Je suis vraiment pas sûr de ce que je fais de mal, mais il semble que tout autres que l'accès restreint uri de travail. Voici ma configuration:
@Configuration
public class Oauth2ServerConfiguration {
private static final String SERVER_RESOURCE_ID = "oauth2-server";
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId(SERVER_RESOURCE_ID);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and().requestMatchers()
.antMatchers("/me")
.and().authorizeRequests()
.antMatchers("/me").access("#oauth2.clientHasRole('ROLE_CLIENT')")
;
}
}
@Configuration
@EnableAuthorizationServer
protected static class AuthotizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private ClientDetailsService clientDetailsService;
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client")
.resourceIds(SERVER_RESOURCE_ID)
.secret("secret")
.authorizedGrantTypes("authorization_code", "refresh_token")
.authorities("ROLE_CLIENT")
.scopes("read","write")
.redirectUris("http://localhost:8080/client")
.accessTokenValiditySeconds(300)
.autoApprove(true)
;
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(tokenStore())
.userApprovalHandler(userApprovalHandler())
.authenticationManager(authenticationManager)
;
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.realm("oauth");
}
@Bean
public ApprovalStore approvalStore() throws Exception {
TokenApprovalStore store = new TokenApprovalStore();
store.setTokenStore(tokenStore());
return store;
}
@Bean
public UserApprovalHandler userApprovalHandler() throws Exception {
TokenStoreUserApprovalHandler handler = new TokenStoreUserApprovalHandler();
handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService));
handler.setClientDetailsService(clientDetailsService);
handler.setTokenStore(tokenStore());
return handler;
}
}
}
Est-il quelque chose que je suis absent ou suis-je aborder cette question de façon incorrecte? Toute aide serait grandement appréciée.
OriginalL'auteur jyore | 2015-04-12
Vous devez vous connecter pour publier un commentaire.
Le problème a fini par être que le serveur de ressources et le serveur d'autorisation n'étaient pas obtenir le même magasin de référence. Vous ne savez pas comment le câblage ne fonctionnait pas correctement, mais à l'aide d'un objet fixe dans la configuration de la classe a travaillé comme un charme. En fin de compte, je vais passer à une persistance soutenue jeton de magasin, ce qui, probablement, n'aurait pas eu tous les problèmes.
Grâce à @OhadR pour la réponse et l'aide!
En fin de compte, je me suis simplifié la configuration, suis passé par le même flux de travail, et il a travaillé sur des
Quelqu'un qui tombe sur ce post, je vous recommande de regarder plus les tests unitaires pour l'exemple, plutôt que de la pleine soufflé sparklr/tonr exemple, comme il a beaucoup de configuration supplémentaires qui ne sont pas forcément nécessaires pour obtenir commencé.
Je ntice que votre réponse implique une
AuthorizationServerConfigurerAdapter
. Je suis unorg.springframework.security.oauth2.provider.NoSuchClientException
erreur dans un Printemps OAuth2 application qui semble résulter de monAuthorizationServerConfigurerAdapter
. Êtes-vous prêt à prendre un coup d'oeil? Voici le lien: stackoverflow.com/questions/36899386/...Je suis en ligne si vous êtes prêt à me donner un indice sur l'autre question. Vous ne savez pas où commencer avec ça.
OriginalL'auteur jyore
Votre étape #6 est faux - jeton d'accès ne doivent pas être envoyés dans l'URL, car il est vulnérable de cette façon. rathen, plutôt que d'OBTENIR, d'utiliser la POSTE.
D'ailleurs, je ne comprends pas votre étape #1 - pourquoi l'appelez-vous /oauth/autoriser? il doit être fait de façon implicite lorsque vous essayez d'obtenir une ressource protégée. Je veux dire, votre débit devrait commencer par:
Ensuite, la négociation va commencer "derrière les coulisses": une redirection vers "/oauth/autoriser" etc.
En outre, à l'étape n ° 8, notez que vous ne demandez pas "un autre jeton d'accès", mais c'est plutôt une demande d'actualisation "jeton". Comme si votre accès à jeton a été expiré.
Note: Le fournisseur d'identité et le serveur de ressources doivent partager la tokenStore! Lire ici: Printemps de Sécurité OAuth2 pure serveur de ressources
HTH
Authorization: Bearer <token>
et dans tous les cas de figure, je continue, pour obtenir le "invalid token" de la réponse. J'ai d'installation de certains de débogage des points de terminaison pour le vidage de l'jetons par client et par utilisateur et mon jeton est dans les deux listes.le serveur de ressources, il doit savoir comment analyser le jeton... avez-vous écrit la ressource protégée?
La ressource est tout simplement un spring-mvc point de terminaison de l'installation de retourner une chaîne json via
@RequestMapping("/me") @ResponseBody public String me() { return "hello";}
. Leorg.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter
rejette le jeton. Puisque l'envoi, j'ai essayé d'ajouter à la configuration deResourceServerSecurityConfirer
une référence à la fois à l'TokenStore
et laTokenServices
haricots, ni de qui ont travaillé.essayez d'arrêt (breakpoint) dans ResourceServerTokenServices.loadAuthentication ( - ) - vous y arriver?
en effet. le fournisseur d'identité et le serveur de ressources doivent partager la tokenStore.
OriginalL'auteur OhadR
Cela fonctionne pour moi:
OriginalL'auteur fywe