как получить токен доступа из токена запроса для OpenID + OAuth с помощью java

Я пытаюсь реализовать гибридный протокол OpenID + OAuth в своем приложении для Google. Я получаю токен запроса. Итак, следующий шаг в качестве документа в системе федеративного входа - это токен запроса обмена на токен доступа.

Я пробовал использовать Java-библиотеку OAuth, но не получаю токен доступа. Пробую и трехногий, и двуногий подходы не увенчались успехом.

Кому-нибудь удастся сделать гибридный протокол.

    GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
        oauthParameters.setOAuthConsumerKey(consumerKey);
        oauthParameters.setOAuthConsumerSecret(consumerSecret);

        calendarService = new CalendarService("marketplace-hello");
        try {
            calendarService.setOAuthCredentials(oauthParameters, 
new OAuthHmacSha1Signer());
            CalendarEventFeed results = calendarService.query(calendarFeedUrl, 
CalendarFeed.class);
        }
 catch (OAuthException e) 
{      
throw new ServletException("Unable to initialize calendar service", e); 
}

Это вызывает исключение com.google.gdata.client.authn.oauth.OAuthException: oauth_token не существует.

oAuthParameters.setOAuthType (OAuthType.TWO_LEGGED_OAUTH); и xoauth_requestor_id attibute для feedURL, если я добавлю эти строки в код, я получаю исключение Invalid AuthSub Token, я не знаю, почему он говорит Invalid AuthSub.


person JAVAC    schedule 22.10.2010    source источник
comment
Вам необходимо включить дополнительную информацию. Почему не работает? Что не так? Есть ли сообщения об ошибках? Объясните, как вы пытаетесь это сделать. Мы не читатели мыслей.   -  person Qwerky    schedule 22.10.2010
comment
В спецификациях OAuth есть 2 спецификации: 1) трехсторонний и 2) двухсторонний. В трехстороннем участвуют 3 стороны 1) поставщик услуг 2) Потребитель и 3) Пользователь В двухстороннем задействованы только 2 стороны 1) поставщик услуг и 2) потребитель и пользователь являются одним и тем же объектом (принадлежат к одному домену). Вышеупомянутый код предназначен для двухстороннего процесса аутентификации, для которого не требуется токен доступа. Но ему нужен ключ потребителя и секретный ключ, при этом он запрашивает идентификатор электронной почты того же домена, например: user @ cosnumerkey. Это единственный сценарий, в котором мы используем двухсторонний процесс аутентификации.   -  person JAVAC    schedule 29.10.2010
comment
Почему бы вам не использовать существующую библиотеку?   -  person Andreas Kuckartz    schedule 23.11.2010


Ответы (1)


Мой ответ здесь может тебе помочь.

Или попробуйте это с вашим requestToken:

import net.oauth.OAuth;
import net.oauth.OAuthAccessor;
import net.oauth.OAuthConsumer;
import net.oauth.OAuthMessage;
import net.oauth.OAuthServiceProvider;
import net.oauth.client.OAuthClient;
import net.oauth.client.httpclient4.HttpClient4;

public class Try {

    public static void doit(String requestToken) throws Exception {

        String requestUrl = "https://www.google.com/accounts/OAuthGetRequestToken";
        String authorizeUrl = "https://www.google.com/accounts/OAuthAuthorizeToken";
        String accessUrl = "https://www.google.com/accounts/OAuthGetAccessToken";
        String consumerKey = "XXXXX";
        String consumerSecret = "XXXXX";
        String callbackUrl = "XXXXX";

        OAuthServiceProvider provider = new OAuthServiceProvider(requestUrl,
                authorizeUrl, accessUrl);

        OAuthConsumer consumer = new OAuthConsumer(callbackUrl, consumerKey,
                consumerSecret, provider);

        consumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.HMAC_SHA1);

        OAuthClient client = new OAuthClient(new HttpClient4());

        OAuthAccessor accessor = new OAuthAccessor(consumer);
        accessor.requestToken = requestToken;

        OAuthMessage result = client.getAccessToken(accessor, null, null);

        System.out.println(accessor.accessToken);
        System.out.println(accessor.tokenSecret);
    }
}
person Ali Shakiba    schedule 30.11.2010