2010-05-08 12 views
6

implementazione del servizio qualcosa di simile con tinyurl o bit.ly, mi piacerebbe esporre il servizio come API, sto usando java e jersey come implementazione del servizio RESTfull.Autenticazione e autorizzazione per RESTfull API (java jersery)

Sto cercando il modo più semplice per l'autenticazione degli utenti che usano l'API, OAuth è la prima cosa che viene in mente, ma il problema è che non ho bisogno di queste 3 chiamate di iterazione con query del token di richiesta, che accedere alla query del token con url di callback che passa. Devo solo dare la possibilità all'utente di invocare API senza ulteriori chiamate di sicurezza al mio server.

+2

Se google a due gambe oauth, penso che troverai che puoi usarlo per il caso che stai descrivendo. Quando non sono coinvolte terze parti (le persone che effettuano le chiamate API al tuo servizio saranno proprietarie dei dati che stanno modificando), non è necessario alcun reindirizzamento. Nella bozza OAuth 2.0, le connessioni effettuate tramite SSL non richiedono più la firma della richiesta. – patrickmcgraw

+0

Sì, penso che questo sia l'approccio migliore, è più sicuro dell'autenticazione http perché non è necessario inviare la password con la richiesta. – abovesun

risposta

11

Grazie a patrickmcgraw commento che ho usato 2 zampe oauth authentificaton. Ecco un po 'di codice java.

Per il lato client (utilizzando 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); 

Sul lato fornitore:

@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"; 
    } 
} 

Ecco il codice per il 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

se state usando HTTP a livello di trasporto si può sempre usare basic http authentication

+0

Grazie per la tua risposta, ma sembra patrickmcgraw proprio su due gambe oauth – abovesun

Problemi correlati