Безопасный API AuthSub в Java (API Календаря Google) - PullRequest
0 голосов
/ 21 января 2011

Я хотел бы аутентифицировать свои запросы Google AuthSub.В основном мне нужно сгенерировать закрытый ключ и соответствующий сертификат, загрузить этот сертификат в Google и подписать ключом при последующих вызовах в Google AuthSub.Я думаю, что самый простой подход заключается в использовании ключевого инструмента Java следующим образом:

# Generate the RSA keys and certificate
keytool -genkey -v -alias Example -keystore ./Example.jks\
  -keyalg RSA -sigalg SHA1withRSA\
  -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain  View, ST=CA, C=US"\
  -storepass changeme -keypass changeme

# Output the public certificate to a file
keytool -export -rfc -keystore ./Example.jks -storepass changeme \
  -alias Example -file mycert.pem

(Как указано http://code.google.com/apis/gdata/docs/auth/authsub.html#keytool)

Я загрузил данный сертификат mycert.pem в Google. В моемJava-клиент, затем я загрузил закрытый ключ следующим образом:

PrivateKey key = AuthSubUtil.getPrivateKeyFromKeystore(
                               "Example.jks", "changeme", "Example", "changeme");

Никаких исключений не выдается при загрузке этого ключа. Затем ключ используется во время вызовов AuthSub следующим образом.

String requestUrl =
  AuthSubUtil.getRequestUrl("http://www.example.com/RetrieveToken",
                            "https://www.google.com/calendar/feeds/",
                            true,
                            true);
...
// Servlet context, user follows the 'next link' with token attached.
String onetimeUseToken = AuthSubUtil.getTokenFromReply(
                                           httpServletRequest.getQueryString());

// Exchange for the AuthSub token.
String sessionToken = AuthSubUtil.exchangeForSessionToken(onetimeUseToken, key);

// Use the token.
CalendarService.setAuthSubToken(sessionToken, key);

// Get calendars from the user.
URL feedUrl = 
    new URL("https://www.google.com/calendar/feeds/default/owncalendars/full");

// Exception is thrown HERE.
CalendarFeed resultFeed = service.getFeed(feedUrl, CalendarFeed.class);

Исключение выдается не при установке или обмене токена, а при попытке получить доступ к ресурсам пользователя. Я не совсем уверен, что с этим делать. Исключение заключается в следующем:

Token invalid - Invalid AuthSub token.

Я немного поиграл с https:// против http:// для URL канала и области видимости, но с небольшим успехом, возможно, что я не пробовал определенную комбинацию.

1 Ответ

0 голосов
/ 22 января 2011

Похоже, что все вышеперечисленное работает правильно, у меня просто была нерелевантная ошибка кодирования.Для записи оба протокола http и https работают до тех пор, пока один из них используется последовательно (в противном случае вы получите ошибку 'scope').

...