Библиотека для поставщика OAuth (Java) [закрыта]

Я ищу библиотеку Java, которая поможет мне создать поставщика OAuth. Я должен иметь возможность получать подписанные запросы OAuth и определять, действительны они или нет (проверка значений подписи, метки времени и одноразового номера).

Знаете ли вы, есть ли что-то, что облегчает эту задачу?


person Pablo Fernandez    schedule 13.11.2009    source источник
comment
Другими словами, вам нужна библиотека Java, которая реализует поставщика OAuth, а не потребителя. Вы можете отредактировать свой вопрос, чтобы исправить это.   -  person Matthias    schedule 21.03.2010
comment
Пабло, пожалуйста, измените заголовок вашего вопроса и ваш вопрос, чтобы отразить намерение. Вам нужен провайдер OAuth...   -  person Hendy Irawan    schedule 22.12.2010
comment
Я ПРОСТО собирался связать вас со Scribe (github.com/fernandezpablo85/scribe -java), когда я заметил, что вы являетесь его автором! Вы на самом деле закончили тем, что сами написали библиотеку? ;-)   -  person Hendy Irawan    schedule 23.12.2010
comment
@Hendy Мне пришлось написать клиентскую библиотеку (писец), потому что все остальное отстой. Мне не нужно было писать серверную часть (поставщик). Может быть, если когда-нибудь понадобится, я сделаю что-нибудь со писцом-сервером. Спасибо   -  person Pablo Fernandez    schedule 23.12.2010
comment
писец? хм... я запутался. Есть ли там пример статуса обновления твиттера? не нашел... :(   -  person gumuruh    schedule 11.11.2011


Ответы (6)


Scribe — это библиотека OAuth для Java, написанная самим автором запроса. ;-)

Примечание. Я публикую это здесь как ответ, чтобы у других пользователей Google был выбор альтернатив. Для другой альтернативы на основе библиотеки см. Мой другой ответ «Библиотека подписи OAuth в Джерси».

Некоторый код для иллюстрации использования:

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

Создание запроса:

OAuthRequest request = OAuthRequest(Verb.GET, "http://api.twitter.com/1/direct_messages.json");
service.signRequest(accessToken, request);
Response response = request.send();
person Hendy Irawan    schedule 23.12.2010
comment
Спасибо за информацию. Но обратите внимание, что этот фрагмент кода не работает для Android 4 и более поздних версий. Похоже, Android 4 нуждается в асинхронных задачах. - person trante; 25.07.2013

Одна библиотека, упомянутая на http://oauth.net/code, выглядит интересной (я исключаю OAuth для Spring Security и OAuth Signpost, которые вам не нужны):

библиотека Java и примеры предоставили Джон Кристиан, Правин Алавилли и Дирк Бальфанц.

Также доступен OAuth для Spring Security, предоставленный Райаном Хитоном. Этот проект не размещен в репозитории OAuth.

OAuth Signpost предлагает простую подпись сообщений OAuth для Java и Apache HttpComponents (готовность к Google Android!) . Предоставлено Маттиасом Капплером.

Я еще немного проверил библиотеку Java и думаю, что она предоставляет все необходимое для клиентского и серверного кода. Следующий сообщение в блоге на самом деле содержит полный пример, и я вставляю код сервера ниже (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"); %> 

Это выглядит близко к тому, что вы хотите.

person Pascal Thivent    schedule 13.11.2009
comment
Просто для уточнения: Паскаль вычеркнул эти библиотеки, потому что они используются только для OAuth на стороне клиента. Однако автор ищет серверную библиотеку OAuth. - person Matthias; 21.03.2010
comment
Любое обновление вашего ответа на 2013 год?! :) - person Ali Shakiba; 19.02.2013
comment
Глядя на сообщение в блоге, кажется, что он пропускает секрет токена (поэтому проверка подписи не должна работать). Кроме того, SimpleOAuthValidator на самом деле никогда не проверяет значения nonce, а это означает, что эта реализация уязвима для атак воспроизведения из ворот. Он все еще может быть полезен в качестве отправной точки, но вам нужно будет использовать его, чтобы сделать его функциональным и безопасным. - person MW.; 01.07.2013

Вы можете использовать библиотеку подписей OAuth в Джерси.

Простую аутентификацию OAuth для сервлета или фильтра можно настроить с помощью фильтра контейнера, который фильтрует запрос до того, как запрос будет сопоставлен и отправлен в корневой класс ресурсов. Контейнерный фильтр регистрируется с использованием параметров инициализации, которые указывают на определяемый пользователем класс, например:

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;
    }
}
person Hendy Irawan    schedule 22.12.2010
comment
Где мы можем найти полный рабочий образец (с модульными тестами)? Спасибо. - person yves amsellem; 22.11.2011

Существует плагин OAuth для Spring Security.

person Kevin    schedule 13.11.2009
comment
Я не использую Spring в своем проекте, а Guice. - person Pablo Fernandez; 14.11.2009

Похоже, репозиторий Subversion для библиотеки находится по адресу http://oauth.googlecode.com/svn/code/java/. Похоже, вам придется проверить и запустить maven, чтобы получить исполняемые файлы.

Если вы зайдете в example/webapp/src/main/java, там есть несколько примеров потребления из Twitter, Yahoo и других.

person Jason Gritman    schedule 13.11.2009
comment
Я думаю, что это только клиентские библиотеки - person Pablo Fernandez; 14.11.2009

Jersey (эталонная реализация JAX-RS) поддерживает OAuth через расширение Jersey под названием OpenSSO Auth Filter. Однако для этого требуется дополнительный экземпляр сервера OpenSSO. Дополнительную информацию см. в этом документе.

Обратите внимание, что Oracle прекратила поддержку OpenSSO и теперь находится в составе ForgeRock как OpenAM.

person Hendy Irawan    schedule 22.12.2010
comment
эй... хенди, ты когда-нибудь пробовал библиотеку Scribe? Я немного запутался, как обращаться с этой библиотекой... так как там нет файлов javadoc. :( - person gumuruh; 11.11.2011