2010-05-08 15 views
6

implementar el servicio de algo similar con tinyurl o bit.ly, estoy gustaría exponer servicio como API, estoy usando Java y Jersey como la implementación del servicio Restfull.autenticación y autorización para Restfull API (java jersery)

Estoy buscando la forma más sencilla para la autenticación de usuarios que usan API, OAuth es lo primero que se viene a la mente, pero el problema es que no necesito estas 3 llamadas de iteración con consulta de token de solicitud, que consulta de token de acceso con devolución de llamada url. Solo necesito darle al usuario la capacidad de invocar la API sin llamadas de seguridad adicionales a mi servidor.

+2

Si google de dos patas oauth Creo que encontrará que puede usarlo para el caso que está describiendo. Cuando no hay una tercera parte involucrada (las personas que hacen las llamadas a la API a su servicio serán propietarios de los datos que están modificando) entonces no hay cambio de dirección es necesario. En el borrador de OAuth 2.0, las conexiones realizadas a través de SSL ya no requieren la firma de solicitudes. – patrickmcgraw

+0

Sí, creo que esto es mejor enfoque, es más segura que la autenticación HTTP, ya que no es necesario para enviar la contraseña con su solicitud. – abovesun

Respuesta

11

Gracias a patrickmcgraw comentario que solía authentificaton 2 OAuth de doble vía. Aquí hay un código java.

Por el lado del cliente (mediante 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); 

El lado del proveedor:

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

Aquí está el código de cliente 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 usted está utilizando HTTP en la capa de transporte siempre se puede utilizar basic http authentication

+0

Gracias por su respuesta, pero parece patrickmcgraw razón de dos patas OAuth – abovesun

Cuestiones relacionadas