2010-05-08 5 views
6

Implementierung Service etwas ähnliches mit tinyurl oder bit.ly, möchte ich den Dienst als API offen legen, ich benutze Java und Jersey als RESTfull Service-Implementierung.Authentifizierung und Autorisierung für RESTfull API (Java Jersery)

Ich suche nach dem einfachsten Weg für die Authentifizierung von Benutzern, die API verwenden, OAuth ist die erste Sache im Hinterkopf, aber das Problem ist, ich brauche diese 3 Iterationsaufrufe mit Anfrage Token Abfrage nicht, als Zugriff Token Abfrage mit Callback-URL wird übergeben. Ich muss nur Benutzer Fähigkeit geben, API ohne zusätzliche Sicherheitsanrufe auf meinen Server aufzurufen.

+2

Wenn Sie Google zweibeinigen oauth Ich denke, du wirst feststellen, dass du es für den Fall, den du beschreibst, verwenden kannst. Wenn keine Drittanbieter beteiligt sind (die Personen, die die API-Aufrufe für Ihren Dienst ausführen, besitzen die Daten, die sie bearbeiten), ist keine Umleitung erforderlich. Im OAuth 2.0-Entwurf ist für Verbindungen, die über SSL erstellt werden, keine Signatur mehr erforderlich. – patrickmcgraw

+0

Ja, denke, dies ist der beste Ansatz, es ist sicherer als HTTP-Authentifizierung, weil Sie kein Passwort mit Ihrer Anfrage senden müssen. – abovesun

Antwort

11

Dank patrickmcgraw I 2-legged oauth authentificaton Kommentar verwendet. Hier ist ein Java-Code.

Für Client-Seite (mit 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); 

Auf Anbieterseite:

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

Hier ist der Code für PHP-Client:

<?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

wenn youre http auf der Transportschicht verwenden, können Sie immer basic http authentication verwenden

+0

Danke für deine Antwort, scheint aber patrickmcgraw richtig über zweibeinigen oauth – abovesun

Verwandte Themen