2017-10-17 4 views
0

Je travaille sur un projet dont j'ai besoin, non seulement pour m'authentifier, mais aussi pour avoir la valeur réelle du jeton.Spring Security oAuth 2.0 UAA obtenir une valeur de jeton de façon automatique

Nous avons une application Spring Boot avec oAuth2.0 Spring Security et le problème est que je ne suis pas en mesure de trouver une méthode qui me donne un jeton valide chaque fois que je l'appelle.

En ce moment, j'ai une première méthode post codé en Java, mais il doit y avoir une mise en œuvre de la sécurité du printemps qui fait quelque chose comme ce qui suit:

  1. La première fois qu'il est appelé, il demande le jeton et le stocke.
  2. Les instants suivants vérifient si le jeton a expiré et, s'il a expiré, il en demande un nouveau.

Où puis-je le trouver?

EDIT

Il y a 2 différentes instances de printemps dans mon projet: Le serveur d'autorisation - qui est un serveur Cloud Foundry SAU - et le serveur de ressources - qui est celui qui demande le jeton et est codé par moi. Le serveur d'autorisation utilise AuthorizationServerTokenServices dans la version JWT et lorsque le serveur de ressources obtient un jeton à partir de là, je veux qu'il soit conservé, non seulement décodé et utilisé car je dois l'envoyer à un autre serveur.

De plus, mon application n'est pas une application web, il n'y a donc pas de page de connexion pour me connecter sur Facebook et je dois obtenir le jeton en utilisant le type de subvention Client Credentials.

Dans mon cas, Single Sign-On n'est pas possible parce que je dois l'utiliser non décodé.

Voici mon implémentation actuelle:

public String obtainAccessToken() throws ClientProtocolException, IOException { 
     HttpClient httpclient = HttpClients.createDefault(); 

     String userPass64 = new String("User and password"); 

     HttpPost httppost = new HttpPost("localhost:8080/uaa/oauth/token?grant_type=client_credentials");  
     httppost.setHeader("Content-Type", "application/x-www-form-urlencoded"); 
     httppost.setHeader("Authorization", "Basic " + userPass64); 

     //Execute and get the response. 
     HttpResponse response = httpclient.execute(httppost); 
     String responseBody = EntityUtils.toString(response.getEntity()); 

     ObjectMapper mapper = new ObjectMapper(); 
     TokenMessage tokenMessage = mapper.readValue(responseBody, TokenMessage.class); 

     return tokenMessage.getAccess_token(); 
    } 
+0

" authomatically "- J'aime ce que vous avez fait là :) – radoh

+0

Que voulez-vous dire par" Je dois l'envoyer à un autre serveur. "? Essayez-vous d'accéder à une autre ressource protégée à partir de ce serveur? – raiyan

Répondre

0

D'après ce que j'ai vu est qu'il ya peu de façons différentes que le printemps sécurité peut gérer cela.

La méthode par défaut consiste à utiliser l'interface AuthorizationServerTokenServices. Et avec cela, vous pouvez avoir différentes façons de stocker le jeton. Par exemple JDBCTokenStore, InMemoryTokenStore et JwtTokenStore. Pour en savoir plus à ce sujet ici: http://projects.spring.io/spring-security-oauth/docs/oauth2.html#managing-tokens

Mais puisque je ne sais pas quel type d'application vous créez, vous pourriez peut-être développer une fonctionnalité de connexion unique et laisser Facebook, par exemple, gérer le jeton d'authentification. "Un bon tutoriel à ce sujet avec Spring boot peut être trouvé ici:

+0

Merci beaucoup pour votre réponse rapide. Je n'ai pas expliqué correctement. J'ai une architecture dans laquelle j'ai le serveur d'autorisation (A Cloud Foundry UAA) séparé du serveur de ressources. AuthorizationServerTokenServices est lié au serveur d'autorisation, mais je souhaite également le stocker dans le serveur de ressources.Le problème avec mon application est que ce n'est pas une application web, donc il n'y a pas de page de connexion pour me connecter à Facebook et je dois obtenir le jeton en utilisant le type de subvention Client Credentials. Par conséquent, Single Sign On n'est pas possible, je pense. – BigEndian32