15

Web サービス (GAE の一部ではない) からデータを取得できる Android アプリを作成しています。ユーザーは、OpenId を使用してブラウザーから Web サービスにログインできます (Google アカウントのみが許可されます)。

AccountManager は私に authtoken を与えることができます。この認証トークンをユーザーの Google アカウント名 (電子メール) と共にサーバーに保存し、このアカウント名を使用して、openid ログインとアプリ登録を関連付けることができます。

しかし、ユーザーの OpenID 情報に対してこのトークンを検証する方法がないため、これでは何も解決しません... それとも? ユーザーのauthtokenを使用して、「どういうわけか」彼のAndroidアカウントをWebアカウントにリンクできると思いました。

これは、これを処理するための間違った方法のように見えますが、ユーザーの Google のユーザー名/パスワードを SharedPreferences に保存し、これらのデータをログインに使用したくありません。

クリエイティブなアイデアはありますか?ありがとう

4

1 に答える 1

3

アプリのプッシュ アクション - http://www.pushactions.comでこの正確な問題を解決しました。私のソリューションでは、最終的に GAE を使用しましたが、トークンを認証するためだけに使用しました。実際の Push Actions アプリは Heroku でホストされています。これが私のフローです:

  1. Android アプリは GAE トークンを生成し、Heroku で実行されているプッシュ アクションにトークンとアカウントのメール アドレスを送信します。
  2. プッシュ アクションは、GAE で実行されているサービスにトークンを投稿します
  3. GAE サービスはトークンを受け取り、それが有効かどうかを判断し、有効な電子メール アドレスを返します。
  4. プッシュ アクションは、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>
于 2011-07-07T19:02:47.730 に答える