2011-06-08 58 views
15

我正在製作一個Android應用程序,該應用程序應該能夠從Web服務(不屬於GAE)獲取數據。用戶可以使用OpenId通過瀏覽器登錄到Web服務(僅允許Google帳戶)。如何讓AccountManager(authtoken)和OpenID一起工作(沒有AppEngine)?

AccountManager可以給我authtoken。我可以將此authtoken保存在我的服務器上,以及用戶的Google帳戶名稱(電子郵件),然後使用此帳戶名稱將他的openid登錄與應用程序註冊關聯起來。

但是這並不能解決任何問題,因爲我無法驗證此令牌對用戶的OpenID信息......或者我呢?我以爲我可以使用用戶的authtoken「以某種方式」將他的Android帳戶鏈接到網絡帳戶。

這看起來越來越像一個錯誤的方式來處理這個問題,但我不想在SharedPreferences中保存用戶的Google用戶名/密碼並使用這些數據進行登錄。

有沒有什麼創意?謝謝

+0

沒有人有一個想法?我讀了很多關於一些相關主題的問題,但是我找不到解決方案。 – user765667 2011-06-09 07:07:38

+0

我們有完全相同的問題。從我們的嘗試,似乎我們可以從AccountManager獲得的authToken只能用於獲取使用OAuth的特定Google API的權限 - 不會使用openID對用戶進行身份驗證 – 2011-06-28 18:41:00

+0

我也很想知道,我需要做同樣的事 – dweebo 2011-07-05 20:15:27

回答

3

我解決了這個確切的問題,我的應用程序推動 - 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"); 
      } 
     } 
    } 
} 

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> 
+0

我告訴你們,這就是答案:)想象一下,如果谷歌提供了一個服務,認證令牌。您所要做的只是將Android生成的令牌發佈到服務中,Google會迴應該令牌是否有效。這聽起來合適嗎?那麼這正是我的答案提供的。 – gotosleep 2011-07-12 18:44:52

+0

真棒,看起來就像我需要的東西。你能告訴我你是如何將標記和電子郵件傳遞給GAE(傳遞給你的PushActionsServlet)的。我無法從你的代碼中知道。非常感謝! – dweebo 2011-07-29 14:38:06

+1

嘿dweebo,我只是做一個HTTP獲取「https://MYAPP.appspot.com/_ah/login?auth=GAE_TOKEN&continue=https://MYAPP.appspot.com」http post可能也有效,還沒有測試 – gotosleep 2011-08-09 20:16:52

相關問題