2009-11-13 24 views
55

Szukam biblioteki Java, która pomaga mi budować dostawcę OAuth. Muszę być w stanie otrzymywać OAuth podpisane wnioski i ustalić, czy są one ważne, czy nie (sprawdzanie wartości sygnatury, datownika i nonce).Biblioteka dostawcy OAuth (Java)

Czy wiesz, czy jest coś, co ułatwia to zadanie?

+7

Innymi słowy, co się szuka to biblioteka Java, która realizuje się OAuth * Dostawca * nie * konsument*. Możesz edytować swoje pytanie, aby to poprawić. – Matthias

+0

Pablo, zmień tytuł pytania i swoje pytanie, aby odzwierciedlić zamiar. Chcesz dostawcę OAuth ... –

+2

Byłem * TYLKO *, aby połączyć cię z Scribe (https://github.com/fernandezpablo85/scribe-java), gdy zauważyłem, że jesteś jego autorem! Czy w efekcie sam napisałeś bibliotekę? ;-) –

Odpowiedz

1

Jest OAuth plugin na wiosnę Bezpieczeństwa

+0

Nie używam Springa w moim projekcie, ale Guice. –

12

jednej biblioteki wspomniano na http://oauth.net/code wygląda ciekawe (mam wyłączeniem OAuth for Spring Security i OAuth Signpost które nie są co szukasz):

Java library i examples były dostarczone przez John Kristian, Praveen Alavilli i Dirk Balfanz.

OAuth for Spring Security jest również dostępny , nadesłane przez Ryana Heatona. Ten projekt nie jest hostowany w repozytorium OAuth .

OAuth Signpost oferuje proste OAuth wiadomość zalogowaniem Java i Apache HttpComponents (Google Android gotowy!). Autor: Matthias Kaeppler.

Sprawdziłem Java library nieco dalej i myślę, że jej zapewnienie wszystko potrzebne na stronie klienta i kodu po stronie serwera. Poniższy blog post ma rzeczywiście pełny przykład i jestem wklejeniu kodu serwera poniżej (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"); %> 

To wygląda blisko tego, co chcesz.

+3

Aby wyjaśnić: Pascal przekroczył te biblioteki, ponieważ są one używane tylko dla OAuth po stronie klienta. jednak jest to biblioteka OAuth po stronie serwera. – Matthias

+2

Jakakolwiek aktualizacja twojej odpowiedzi na 2013 ?! :) –

+0

Patrząc na post, wydaje się, że pomijam token (tak, że weryfikacja podpisu nie powinna zadziałać). Ponadto SimpleOAuthValidator nigdy nie sprawdza wartości nonce, co oznacza, że ​​ta implementacja jest podatna na atakowanie z bramek. Nadal może być przydatny jako punkt wyjścia, ale będziesz musiał go zbudować, aby był funkcjonalny i bezpieczny. –

0

Wygląda na repozytorium Subversion dla biblioteki pod numerem http://oauth.googlecode.com/svn/code/java/. Wygląda na to, że będziesz musiał się wymeldować i uruchomić program maven, aby pobrać pliki wykonywalne.

Jeśli przejdziesz do przykładu/webapp/src/main/java, mają kilka przykładów korzystania z Twittera, Yahoo, & innych.

+2

Myślę, że są to tylko biblioteki klienckie –

0

Jersey (implementacja referencyjna JAX-RS) obsługuje OAuth poprzez rozszerzenie Jersey o nazwie Filtr OpenSSO Auth. Wymaga to jednak dodatkowej instancji serwera OpenSSO. Zobacz this document for more information.

Należy zauważyć, że OpenSSO został wycofany przez Oracle i jest obecnie under ForgeRock as OpenAM.

+0

hej ... hendy czy kiedykolwiek próbowałeś biblioteki Scribe? Jestem nieco zdezorientowany, jak sobie z tym poradzić ... ponieważ nie ma tam plików javadoc. :( – gumuruh

+0

Przepraszam, nie :) hehe –

4

Można użyć urządzenia Jersey OAuth Signature Library.

Proste uwierzytelnianie protokołu OAuth dla serwletu lub filtra można skonfigurować przy użyciu filtru kontenera, który filtruje żądanie przed dopasowaniem żądania i wysłaniem go do klasy zasobu głównego.Filtr Pojemnik jest zarejestrowany za pomocą parametrów inicjalizacji które wskazują na klasy zdefiniowane przez użytkownika, takich jak:

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

Gdzie możemy znaleźć pełną próbkę roboczą (z testami jednostkowymi)? Dzięki. –

30

Scribe jest biblioteką OAuth for Java, napisany przez samego pytającego. ;-)

Uwaga: zamieszczam tutaj odpowiedź, aby inni pracownicy Google mieli do wyboru alternatywę. Aby zapoznać się z inną opcją opartą na bibliotece, zobacz moją drugą odpowiedź "Biblioteka sygnatur OAuth Jersey".

Niektóre kodu do zilustrowania wykorzystania:

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); 

tworzeniu żądanie:

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

wow! dobra robota @Hendy – Dejell

+0

Dziękuję za informację. Pamiętaj jednak, że ten fragment kodu nie działa na urządzeniach z Androidem 4 i nowszych. Wygląda na to, że Android 4 potrzebuje asynchronicznych zadań. – trante