Java中的安全API AuthSub(Google Calendar API)

时间:2011-01-21 17:42:31

标签: java google-calendar-api keystore authsub

我想验证我的Google AuthSub请求。基本上我需要生成私钥和相应的证书,将此证书上传到Google,并在随后的Google AuthSub调用中使用密钥进行签名。我认为最直接的方法是使用Java的keytool如下:

# 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:// 对玩家网址和范围网址进行了一些玩耍,但收效甚微,但我可能没有'虽然尝试了某种组合。

1 个答案:

答案 0 :(得分:0)

似乎所有上述工作都正确,我只是有一个不相关的编码错误。对于记录,http和https都可以正常工作(否则会出现'范围'错误)。