アプリのプッシュ アクション - http://www.pushactions.comでこの正確な問題を解決しました。私のソリューションでは、最終的に GAE を使用しましたが、トークンを認証するためだけに使用しました。実際の Push Actions アプリは Heroku でホストされています。これが私のフローです:
- Android アプリは GAE トークンを生成し、Heroku で実行されているプッシュ アクションにトークンとアカウントのメール アドレスを送信します。
- プッシュ アクションは、GAE で実行されているサービスにトークンを投稿します
- GAE サービスはトークンを受け取り、それが有効かどうかを判断し、有効な電子メール アドレスを返します。
- プッシュ アクションは、GAE から返された電子メール アドレスと Android アプリからの電子メール アドレスを比較し、それらが一致する場合、トークンはその電子メール アドレスに対して有効です。これは、トークンを Google ユーザーの openid メールアドレスに安全に関連付けることができることを意味します。
私の知る限り、これは AccountManager によって生成されたトークンが有効かどうかを確認する唯一の方法です。確かに、GAE を使用する必要がありますが、それはアプリ全体の 1 つの小さな部分に限られます。私の GAE サービスは最終的に 1 つのクラスと数行のコードのようになったので、大したことではありません。GAE は、トークンを認証するために Google が提供するサービスと考えることができます。
私のGAEサービスのコードは次のとおりです。
package com.pushactions;
import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
@SuppressWarnings("serial")
public class PushActionsAuthServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(HttpServlet.class.getName());
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user != null) {
req.setAttribute("user", user);
try {
req.getRequestDispatcher("/logged_in.jsp").forward(req, resp);
} catch (ServletException e) {
log.severe("Couldn't redirect to logged_in.jsp");
}
} else {
try {
req.getRequestDispatcher("/logged_out.jsp").forward(req, resp);
} catch (ServletException e) {
log.severe("Couldn't redirect to logged_out.jsp");
}
}
}
}
Logged_in.jsp:
<%@ page import="com.google.appengine.api.users.User" %>
<% User user = (User)request.getAttribute("user"); %>
<?xml version="1.0" encoding="UTF-8"?>
<result>
<status>ok</status>
<user_name><%= user.getEmail() %></user_name>
</result>
Logged_out.jsp:
<%@ page import="com.google.appengine.api.users.User" %>
<% User user = (User)request.getAttribute("user"); %>
<?xml version="1.0" encoding="UTF-8"?>
<result>
<status>error</status>
<message>not logged in</message>
</result>