如何使AccountManager(authtoken)和OpenID一起工作(没有AppEngine)?

时间:2011-06-08 08:38:11

标签: android openid webserver accountmanager auth-token

我正在制作一款能够从网络服务(不属于GAE)获取数据的Android应用。用户可以使用OpenId通过浏览器登录Web服务(仅允许使用Google帐户)。

AccountManager可以给我authtoken。我可以将这个authtoken保存在我的服务器上,连同用户的谷歌帐户名(电子邮件),然后使用此帐户名将他的openid登录与应用程序注册连接。

但这并没有解决任何问题,因为我无法根据用户的OpenID信息验证此令牌......或者我?我以为我可以使用用户的authtoken“以某种方式”将他的Android帐户链接到网络帐户。

这看起来越来越像是一种错误的处理方式,但我不想在SharedPreferences中保存用户Google的用户名/密码,并使用这些数据进行登录。

有创意吗?感谢

1 个答案:

答案 0 :(得分:3)

我为我的应用推送操作解决了这个问题 - http://www.pushactions.com。对于我的解决方案,我最终使用GAE,但仅用于验证令牌。实际的Push Actions应用程序托管在Heroku上。这是我的流程:

  1. Android应用生成GAE令牌然后发布令牌&帐户的电子邮件 推送动作的地址 Heroku的
  2. 推送操作将令牌发布到我在GAE上运行的服务
  3. GAE服务获取令牌,确定它是否有效,并返回有效的电子邮件地址
  4. 推送操作会将GAE返回的电子邮件地址与Android应用中的电子邮件地址进行比较,如果匹配,则该令牌对该电子邮件地址有效。这意味着令牌可以安全地与谷歌用户的开放电子邮件地址相关联。
  5. 据我所知,这是验证AccountManager生成的令牌是否有效的唯一方法。确实,它确实需要使用GAE,但仅适用于整个应用程序的一小部分。我的GAE服务最终变成了一类和几行代码,所以它并不多。您可以将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>