Sécurisation de L'API REST sur Play framework et OAuth2

je développe une application avec Play 2.0 et Scala qui expose quelques API REST. Ces API seront utilisées par différentes applications, web, mobile ou bureau, de sorte que le protocole OAuth (OAuth2) semble le plus approprié.

J'utiliserais d'abord un fournisseur externe comme Facebook.

ma question Est: Quel est le flux exact pour autoriser l'appel de repos individuel? Que dois-je attendre du côté du serveur pour chaque appel et que dois-je vérifier auprès du fournisseur externe?

avec OAuth1 je savais que le client envoyait le token avec toute la demande signée, mais avec Oauth2 Je ne pense pas, j'imagine que si un token n'est pas signé n'est pas fiable et donc je ne pense pas que ce soit le flux.

40
demandé sur Pale Blue Dot 2012-07-07 13:30:08

7 réponses

vous pourriez utiliser un module appelé SecureSocial.

https://github.com/jaliss/securesocial/

celui-ci est très raffiné et beaucoup de personnes dans la communauté Play semblent être au courant/utilisant ce module.

pour l'autorisation pourrait être utile. https://github.com/schaloner/deadbolt-2/

Pour fin pour fin scala trucs, https://github.com/t2v/play20-auth

17
répondu Rakesh Waghela 2013-04-17 15:47:44

J'ai porté Apache Amber à Play2 Scala, voici le lien: https://github.com/cleanyong/oauth2play2scala

La raison pour port d'Apache Ambre est:

  1. il été testé
  2. meilleur que home made
  3. it fit Play2 Scala API
  4. facile à utiliser
  5. non-intrusif

Si vous souhaitez configurer les oauth2 serveur sur votre site, vous pouvez essayer d'utiliser mon port. Il a document.

16
répondu Clean Yong 2013-08-10 02:50:30

fondamentalement, le débit standard est le suivant:

  1. a chaque demande, cochez le cookie ("session" dans le jeu! dialecte) si elle contient un id
  2. si non, demandez à l'utilisateur de s'authentifier avec le fournisseur (Facebook ou autre chose)
  3. si vous êtes d'accord, le fournisseur vous renverra un id, enregistrez cet id dans votre système de persistance (enregistrement), et dans le cookie/session en cours
  4. sur les requêtes suivantes, vérifiez si l'id existe dans cookie/session et correspond à un utilisateur existant dans votre système de persistance
  5. "déconnexion", juste effacer le cookie/session

Si vous voulez plus de détails, il suffit de demander :-)

7
répondu nico_ekito 2012-07-15 12:21:42

OAuth est un protocole D'autorisation, donc si vous cherchez une solution D'authentification, CE n'est peut-être pas la bonne.

vous dites que le consommateur de L'API sera d'application variée. Cela conduit à 2 scénarios,

 1. Where there is no end user involved (grant_type: client_credential)  
 2. Where end-user can consume these APIs on multiple Application (Owned by your Org) (grant_type: implicit/password)
 3. Where end-user can consume these APIs via third Party Applications.(authrization_code)

pour soutenir OAuth Eco-System, vous avez besoin d'un système de gestion clé. D',

  1. Générer la Clé/le Secret pour les Applications.
  2. Generating Accessstoken/Refresh_token/authorization_code

maintenant venir au point de terminaison de vous exposer,

3-Legged OAuth
GET     /authorize  authorize{entry point/ initiate oauth}  
    Sample Call: http://YourAPIService.com/authorize?response_type=code&client_id=GG1IbStzH45ajx9cEeILqjFt&scope=READ&redirect_uri=www.google.com

    GET     /login  login (Call Page for login App, 302 redirected from /authorize)     
Sample Call: http://YourAPIService.com/v1/oauth20/login?response_type=code&client_id=GG1IbStzH45ajx9cEeILqjFt&scope=READ&redirect_uri=www.google.com

    POST    /dologin    consentPage     http://YourAPIService.com/dologin 
    Submit the credential, On success, render the application page 

    POST    /grantpermission    consentSubmission   http://YourAPIService.com/grantpermission
Permission has been granted/declined. Send a 302 to generate authorization_code 

    GET      /code          AuthorizationCode {To generate auth code}
    Sample Call: http://YourAPIService.com/code?client_id=GG1IbStzH45ajx9cEeILqjFt&response_type=code&user_id=user@YourAPIService.com&redirect_uri=www.google.com

    POST    /token  GenerateAccessToken     http://YourAPIService.com/token 
Sample call: http://kohls-test.mars.apigee.net/v1/oauth20/token
Header: Authorization: Basic R0cxSWJTdHpINDVhang5Y0VlSUxxalFj its generated with apps Api Key & Secret.
Payload: 
grant_type=authorization_code&scope=x&redirect_uri=www.google.com&code=abc123

autrement la solution la plus simple/robuste serait, http://apigee.com

vous pouvez utiliser l'écosystème existant de L'Apigée.

4
répondu Abhishek Tyagi 2013-04-17 17:33:42

je n'ai pas essayé moi-même , mais que diriez - tuxdna module. Comme dans le GitHub repo il est dit:

serveur OAuth2 utilisant Play! Framework 2.0

j'espère que cela aide

1
répondu mosid 2015-03-18 13:33:40

j'ai eu le MÊME PROBLÈME, Ce que j'ai fait ( je suppose que ce n'est pas la meilleure solution) était, de placer les méthodes du serveur de repos, à l'intérieur d'un "@Security.Authentifié (Sécurisé.class)", et, utiliser un cookie de session (qui a également été enregistré à l'intérieur d'une table de hachage dans le backend). Le cookie de session a été généré après l'ouverture de session de l'utilisateur

I post code:

package controllers;

import ...;

@Security.Authenticated(Secured.class)
public class ExampleController extends Controller {

    public static String currentUserEmail() {

 ... return json after checking that 'session("id")' exists in the loggedin users hash table... 

}

et

package controllers;

import ...;

public class Secure extends Security.Authenticator {

    @Override
    public String getUserId(Http.Context context) {
        return context.session().get("user_id");
    }
...
}

J'espère que cela aidera

0
répondu xyz 2013-05-11 03:42:08

vous pouvez essayer d'utiliser ce modèle pour le jeu qui combine le fournisseur OAuth 2 avec Deadbolt. La portée de OAuth correspond au concept de permission et de rôle de la serrure. Il utilise Redis pour stocker les tokens d'accès, et ils expirent automatiquement après la période que vous avez configurée.

https://github.com/lglossman/scala-oauth2-deadbolt-redis

0
répondu Leandro Glossman 2016-07-12 19:27:45