valider le jeton d'accès OAuth 2.0 à partir d'un serveur de ressources Spring RESTful


Je veux sécuriser mon backend Spring RESTful. Un moyen (le droit?) est d'utiliser OAuth 2.0 comme montré ici:

Http://www.youtube.com/watch?v=8uBcpsIEz2I

Dans mon architecture, le serveur de ressources et le serveur d'autorisation NE SONT PAS la même entité. Je ne fais que fournir des services de repos JSON. Pas d'interface utilisateur. Si je lis leOAuth2 RFC {[6] } ils disent juste:

L'interaction entre le serveur d'autorisation et le serveur de ressources est au-delà de la portée de cette spécification. Le serveur d'autorisation peut être le même serveur que le serveur de ressources ou une entité distincte. Un serveur d'autorisation unique peut émettre des jetons d'accès acceptés par serveurs de ressources multiples.

J'ai trouvé un bon diagramme sur cloudfoundry.com (lié à la vidéo youtube ci-dessus) que j'utilise pour illustrer mon point de vue:

entrez la description de l'image ici

Fournisseur de"jeton": Cela pourrait/devrait être google ou facebook pour exemple.

Backend RESTful: C'est en fait mon code. Services de repos de printemps comme:

@Controller
@RequestMapping("/api/v1")
public class MyResourceToProtect {

    @Autowired
    private MyService service;

    @RequestMapping(value = "/resource/delete/{name}",
                    method = RequestMethod.DELETE,
                    consumes = MediaType.APPLICATION_JSON_VALUE,
                    headers = "Content-Type=application/json")
    @ResponseStatus(HttpStatus.OK)
    public void delete(@PathVariable("name") String name) {
        service.delete(name);
    }
}

(Ceci est juste un exemple de code)

Maintenant, ma question: Est-il possible de valider les jetons d'accès générés par le serveur AuthServer (Facebook, Google)? Je sais que j'ai besoin d'un mappage "token to user" (base de données) quelque part sur mon ResourceServer. Fondamentalement, je voudrais concevoir mon API RESTful comme à un de PayPal:

Https://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/

Mais comment puis-je gérer les étapes 1 et 2 si je veux utiliser Facebook ou Google en tant que fournisseurs d'authentification? Est-ce même possible?

Pensée supplémentaire: Je dois probablement fournir mon propre point de terminaison /oauth2/token, puis déléguer au AuthProvider sous-jacent.

Author: domi, 2013-07-14

1 answers

Je ne sais pas comment répondre à toutes les questions avec un bel arc, donc je vais juste mettre les points suivants là-bas:

  • Essayez-vous de simplement consommer une API sécurisée OAuth comme Facebook de manière sécurisée OAuth? Utilisez Spring Social.
  • Si vous essayez de créer votre PROPRE API REST et d'utiliser votre PROPRE contexte utilisateur, utilisez Spring Security OAuth. Dans ce cas, vous exigeriez que les clients s'authentifient en utilisant OAuth contre VOTRE API, pas Facebook ou LinkedIn, etc.
  • Printemps Sécurité sociale (dans le 1.2.x series) prend en charge la "signature" de l'utilisateur à la suite d'une connexion OAuth (par exemple, "connexion avec facebook","..Twitter,' '..linkedin, etc...., et votre application se retrouve finalement avec un principal de sécurité Spring en session, comme si vous aviez utilisé un formulaire HTTP pour connecter l'utilisateur manuellement.
  • Spring Security OAuth ne se soucie pas d'où vous avez obtenu le principal de Spring Security. Il se soucie juste si le principal a les bons rôles / portées requis par le Client OAuth de sécurité de printemps. Donc, il n'y a aucune raison que vous ne puissiez pas utiliser Spring Social pour vous connecter en toute sécurité à Facebook, utilisez Spring Social Security pour que cette connexion crée un objet d'authentification Spring Security, puis utilisez Spring Security OAuth pour sécuriser tout accès à VOTRE API, qui à son tour pourrait se connecter en toute sécurité à l'API Les clients utiliseraient le jeton d'accès OAuth pour VOTRE API, pas Facebook. Qui est prise en charge dans le service.
 4
Author: Josh Long, 2013-07-15 22:14:57