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

use*_*667 15 openid webserver android auth-token accountmanager

我正在制作一个Android应用程序,它应该能够从Web服务(不是GAE的一部分)获取数据.用户可以使用OpenId通过浏览器登录Web服务(仅允许使用Google帐户).

AccountManager可以给我authtoken.我可以将此authtoken与用户的谷歌帐户名(电子邮件)一起保存在我的服务器上,然后使用此帐户名将他的openid登录与应用程序注册相关联.

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

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

有创意吗?谢谢

got*_*eep 3

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

  1. Android 应用程序生成 GAE 令牌,然后将令牌和帐户的电子邮件地址发布到 Heroku 上运行的推送操作
  2. 推送操作将令牌发布到我在 GAE 上运行的服务
  3. GAE 服务获取令牌,确定其是否有效,并返回其有效的电子邮件地址
  4. 推送操作将 GAE 返回的电子邮件地址与 Android 应用程序中的电子邮件地址进行比较,如果匹配,则令牌对该电子邮件地址有效。这意味着该令牌可以安全地与 google 用户的 openid 电子邮件地址关联。

据我所知,这是验证 AccountManager 生成的令牌是否有效的唯一方法。确实,它确实需要使用 GAE,但仅适用于整个应用程序的一小部分。我的 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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

登录.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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)