【问题标题】:How to make AccountManager (authtoken) and OpenID work together (without AppEngine)?如何让 AccountManager (authtoken) 和 OpenID 一起工作(没有 AppEngine)?
【发布时间】:2011-09-10 16:44:39
【问题描述】:

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

AccountManager 可以给我 authtoken。我可以将此 authtoken 连同用户的 google 帐户名(电子邮件)一起保存在我的服务器上,然后使用此帐户名将他的 openid 登录名与应用程序注册联系起来。

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

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

有什么创意吗?谢谢

【问题讨论】:

  • 没人有想法吗?我阅读了很多关于一些相关主题的问题,但没有找到解决方案。
  • 我们有完全相同的问题。从我们的尝试来看,我们可以从 AccountManager 获得的 authToken 似乎只能用于使用 OAuth 获取特定谷歌 API 的权限 - 不使用 openID 对用户进行身份验证
  • 我也很想知道,我需要做同样的事情

标签: android openid webserver accountmanager auth-token


【解决方案1】:

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

  1. Android 应用程序生成 GAE 令牌,然后发布令牌和帐户的电子邮件 正在运行的推送操作的地址 Heroku
  2. 推送操作将令牌发布到我在 GAE 上运行的服务
  3. GAE 服务获取令牌,确定其是否有效,并返回其有效的电子邮件地址
  4. Push Actions 将 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");
            }
        }
    }
}

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>

【讨论】:

  • 我告诉你们,这就是答案 :) 想象一下,如果谷歌提供了一个验证令牌的服务。您所要做的就是将 Android 生成的令牌发布到服务中,Google 会响应令牌是否有效。听起来合适吗?嗯,这正是我的回答所提供的。
  • 真棒,看起来正是我需要的。您能告诉我如何将令牌和电子邮件传递给 GAE(传递给您的 PushActionsAuthServlet)。我无法从你的代码中看出。非常感谢!
  • 嘿 dweebo,我只是对“MYAPP.appspot.com/_ah/login?auth=GAE_TOKEN&continue=https://…”进行 http 访问,http 帖子可能也可以,尚未测试
  • 我做了和你一样的事情。我创建了一个 python GAE 应用程序来接收身份验证信息并返回用户的电子邮件。必须检查的一件事是某些用户的电子邮件地址中有大写字符,因此请记住仅在使用某些功能使所有字符都小写后才比较电子邮件。
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2017-12-21
  • 1970-01-01
  • 2015-10-01
  • 2017-06-11
  • 2014-01-12
相关资源
最近更新 更多