2009-11-13 72 views
55

Sto cercando una libreria Java che mi aiuti a creare un provider OAuth. Devo essere in grado di ricevere le richieste firmate OAuth e determinare se sono valide o meno (controllare la firma, il timestamp e i valori nonce).Libreria per OAuth Provider (Java)

Sapete se c'è qualcosa che rende questo compito più semplice?

+7

In altre parole, ciò che stai cercando è una libreria Java che realizza un fornitore di OAuth * * non * consumatore*. Potresti voler modificare la tua domanda per correggerla. – Matthias

+0

Pablo, per favore cambia il titolo della domanda e la tua domanda per riflettere l'intenzione. Vuoi un fornitore OAuth ... –

+2

Ero * SOLO * in procinto di collegarti a Scribe (https://github.com/fernandezpablo85/scribe-java) quando ho notato che sei il suo autore! Hai finito per scrivere tu stesso la biblioteca? ;-) –

risposta

1

C'è un OAuth plugin per la primavera Sicurezza

+0

Non sto usando Spring nel mio progetto ma Guice. –

12

Una biblioteca menzionato sul http://oauth.net/code sembra interessante (sto escludendo il OAuth for Spring Security e OAuth Signpost che non è quello che stai cercando):

A Java library e examples erano contribuito da John Kristian, Praveen Alavilli e Dirk Balfanz.

OAuth for Spring Security è disponibile anche , fornito da Ryan Heaton. Questo progetto non è ospitato nel repository OAuth .

OAuth Signpost offre semplici OAuth messaggio firma per Java e Apache HttpComponents (Google Android pronto!). Contribuito da Matthias Kaeppler.

Ho controllato il Java library un po 'oltre e penso che la sua fornendo tutto il necessario per client-side e il codice lato server. Il seguente blog post ha in realtà un esempio completo e sto incollando il codice del server al di sotto (JSP):

<%@ page import="net.oauth.server.*"%> 
<%@ page import="net.oauth.*"%> 

<% 
//Presumably this should actually be looked up for a given key. 
String consumerSecret="uynAeXiWTisflWX99KU1D2q5"; 

//Presumably the key is sent by the client. This is part of the URL, after all. 
String consumerKey="orkut.com:623061448914"; 

//Construct the message object. Use null for the URL and let the code construct it. 
OAuthMessage message=OAuthServlet.getMessage(request,null); 

//Construct an accessor and a consumer 
OAuthConsumer consumer=new OAuthConsumer(null, consumerKey, consumerSecret, null); 
OAuthAccessor accessor=new OAuthAccessor(consumer); 

//Now validate. Weirdly, validator has a void return type. It throws exceptions 
//if there are problems. 
SimpleOAuthValidator validator=new SimpleOAuthValidator(); 
validator.validateMessage(message,accessor); 

//Now what? Generate some JSON here for example. 
System.out.println("It must have worked"); %> 

Questo sembra vicino a quello che si vuole.

+3

Giusto per chiarire: Pascal ha attraversato queste librerie perché sono utilizzate solo per OAuth lato client. Quello che l'autore sta cercando tuttavia, è una libreria OAuth lato server. – Matthias

+2

Qualsiasi aggiornamento alla risposta per il 2013 ?! :) –

+0

Guardando il post del blog, sembra che stia omettendo il segreto del token (quindi la verifica della firma non dovrebbe funzionare). Inoltre, SimpleOAuthValidator non verifica mai i valori di nonce, il che significa che questa implementazione è vulnerabile a riprodurre attacchi fuori dal gate. Potrebbe comunque essere utile come punto di partenza, ma dovrai costruirlo per renderlo funzionale e sicuro. –

0

Sembra che ci sia un repository Subversion per una libreria su http://oauth.googlecode.com/svn/code/java/. Sembra che dovrai fare checkout ed eseguire Maven per ottenere gli eseguibili.

Se si va nell'esempio/webapp/src/main/java hanno alcuni esempi di consumo da parte di Twitter, Yahoo, altri &.

+2

Penso che quelle siano librerie solo client –

0

Jersey (l'implementazione di riferimento di JAX-RS) supporta OAuth tramite un'estensione Jersey denominata OpenSSO Auth Filter. Tuttavia, ciò richiede un'istanza del server OpenSSO aggiuntiva. Vedi this document for more information.

Nota che OpenSSO è stato sospeso da Oracle ed è ora under ForgeRock as OpenAM.

+0

hey ... hendy hai mai provato la libreria Scribe? Sono un po 'confuso su come gestire quella libreria ... dal momento che non ha file javadoc laggiù. :( – gumuruh

+0

scusate, no :) hehe –

4

È possibile utilizzare Jersey OAuth Signature Library.

L'autenticazione OAuth semplice per un servlet o un filtro può essere impostata utilizzando un filtro contenitore, che filtra la richiesta prima che la richiesta sia abbinata e inviata a una classe di risorsa radice.Il filtro contenitore viene registrata utilizzando i parametri di inizializzazione, che puntano a una classe definita dall'utente, come ad esempio il seguente:

public class OAuthAuthenticationFilter implements ContainerRequestFilter { 
    @Override 
    public ContainerRequest filter(ContainerRequest containerRequest) { 
     // Read the OAuth parameters from the request 
     OAuthServerRequest request = new OAuthServerRequest(containerRequest); 
     OAuthParameters params = new OAuthParameters(); 
     params.readRequest(request); 

     // Set the secret(s), against which we will verify the request 
     OAuthSecrets secrets = new OAuthSecrets(); 
     // ... secret setting code ... 

     // Check that the timestamp has not expired 
     String timestampStr = params.getTimestamp(); 
     // ... timestamp checking code ... 

     // Verify the signature 
     try { 
      if(!OAuthSignature.verify(request, params, secrets)) { 
       throw new WebApplicationException(401); 
      } 
     } catch (OAuthSignatureException e) { 
      throw new WebApplicationException(e, 401); 
     } 

     // Return the request 
     return containerRequest; 
    } 
} 
+0

Dove possiamo trovare un campione funzionante completo (con test unitari)? Grazie. –

30

Scribe è una libreria OAuth per Java, scritto dal richiedente stesso. ;-)

Nota: inserisco questo qui come risposta in modo che altri googler abbiano una scelta di alternative. Per un'altra alternativa basata su libreria, vedere la mia altra risposta "Libreria di firma OAuth Jersey".

del codice per illustrare l'utilizzo:

OAuthService service = new ServiceBuilder() 
            .provider(TwitterApi.class) 
            .apiKey("your_api_key") 
            .apiSecret("your_api_secret") 
            .build(); 
... 
Token requestToken = service.getRequestToken(); 
String your_token = requestToken.getToken(); 
... 
Verifier verifier = new Verifier("your_previously_retrieved_verifier"); 
Token accessToken = service.getAccessToken(requestToken, verifier); 

Creazione della richiesta:

OAuthRequest request = OAuthRequest(Verb.GET, "http://api.twitter.com/1/direct_messages.json"); 
service.signRequest(accessToken, request); 
Response response = request.send(); 
+0

Eeeek !!! buon lavoro @ Hendy – Dejell

+0

Grazie per l'informazione. Tuttavia, tieni presente che questo snippet di codice non funziona per Android 4 e altro. Sembra che Android 4 abbia bisogno di task asincroni. – trante