2010-05-08 13 views
6

implémentant quelque chose de similaire avec tinyurl ou bit.ly, je voudrais exposer le service en tant qu'API, j'utilise java et jersey comme implémentation du service RESTfull. Je cherche le moyen le plus simple pour l'authentification des utilisateurs qui utilisent l'API, OAuth est la première chose qui vient à l'esprit, mais le problème est que je n'ai pas besoin de 3 appels d'itération avec demande de jeton, callback de l'URL de rappel. Je dois juste donner à l'utilisateur la possibilité d'invoquer api sans appels de sécurité supplémentaires à mon serveur.Authentification et autorisation pour l'API RESTfull (java jersery)

+2

Si vous google à deux pattes oauth Je pense que vous trouverez que vous pouvez l'utiliser pour le cas que vous décrivez. Quand il n'y a pas de tiers impliqué (les personnes qui font les appels d'API à votre service posséderont les données qu'ils modifient) alors aucune redirection n'est nécessaire. Dans le brouillon OAuth 2.0, les connexions effectuées via SSL ne nécessitent plus de signature de requête. – patrickmcgraw

+0

Oui, pense que c'est la meilleure approche, il est plus sûr que l'authentification http parce que vous n'avez pas besoin d'envoyer un mot de passe avec votre demande. – abovesun

Répondre

11

Merci à patrickmcgraw commenter je 2 pattes oauth authentificaton. Voici un code java.

pour le côté client (en utilisant Jersey api):

OAuthParameters params = new OAuthParameters().signatureMethod("HMAC-SHA1"). 
    consumerKey("consumerKey").version("1.1"); 

OAuthSecrets secrets = new OAuthSecrets().consumerSecret("secretKey"); 
OAuthClientFilter filter = new OAuthClientFilter(client().getProviders(), params, secrets); 


WebResource webResource = resource(); 
webResource.addFilter(filter); 

String responseMsg = webResource.path("oauth").get(String.class); 

Sur le côté du fournisseur:

@Path("oauth") 
public class OAuthService { 
    @GET 
    @Produces("text/html") 
    public String secretService(@Context HttpContext httpContext) { 
     OAuthServerRequest request = new OAuthServerRequest(httpContext.getRequest()); 

     OAuthParameters params = new OAuthParameters(); 
     params.readRequest(request); 
     OAuthSecrets secrets = new OAuthSecrets().consumerSecret("secretKey"); 

     try { 
      if(!OAuthSignature.verify(request, params, secrets)) 
       return "false"; 
     } catch (OAuthSignatureException ose) { 
      return "false"; 
     } 

     return "OK"; 
    } 
} 

Voici le code pour le client PHP:

<?php 

require_once 'oauth.php'; 

$key = 'consumerKey'; 
$secret = 'secretKey'; 
$consumer = new OAuthConsumer($key, $secret); 

$api_endpoint = 'http://localhost:9998/oauth'; 
$sig_method = new OAuthSignatureMethod_HMAC_SHA1; 

$parameters = null; 
$req = OAuthRequest::from_consumer_and_token($consumer, null, "GET", $api_endpoint, $parameters); 
$sig_method = new OAuthSignatureMethod_HMAC_SHA1(); 
$req->sign_request($sig_method, $consumer, null);//note: double entry of token 

//get data using signed url 
$ch = curl_init($req->to_url()); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$res = curl_exec($ch); 

echo $res; 
curl_close($ch); 
0

si vous êtes en utilisant http à la couche de transport, vous pouvez toujours utiliser basic http authentication

+0

Merci pour votre réponse, mais semble bien patrickmcgraw oauth à deux pattes – abovesun