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.
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
J'ai porté Apache Amber à Play2 Scala, voici le lien: https://github.com/cleanyong/oauth2play2scala
La raison pour port d'Apache Ambre est:
- il été testé
- meilleur que home made
- it fit Play2 Scala API
- facile à utiliser
- non-intrusif
Si vous souhaitez configurer les oauth2 serveur sur votre site, vous pouvez essayer d'utiliser mon port. Il a document.
fondamentalement, le débit standard est le suivant:
- a chaque demande, cochez le cookie ("session" dans le jeu! dialecte) si elle contient un id
- si non, demandez à l'utilisateur de s'authentifier avec le fournisseur (Facebook ou autre chose)
- 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
- 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
- "déconnexion", juste effacer le cookie/session
Si vous voulez plus de détails, il suffit de demander :-)
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',
- Générer la Clé/le Secret pour les Applications.
- 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.
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
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.