2012-05-11 106 views
7

我正在編寫一個與遠程服務器交談的Android應用程序,並且我想允許應用程序用戶使用駐留在其手機上的Google憑據登錄到服務器,即不需要用戶可以在我的應用中的任何位置輸入他們的Google密碼。例如,如果用戶的(Android)手機已配置爲「[email protected]」,然後他們安裝並運行我的應用程序,則我的應用程序會向他們顯示一個對話框,指出「您是否希望以某種方式登錄@ gmail.com?「,當點擊確定按鈕時,他們會在我的服務器上建立一個id,它知道他們的電子郵件地址是[email protected],由google自己進行驗證。Android應用程序中的Google帳戶授權

我發現了關於如何去做這件事的廣泛和多樣的部分食譜,包括谷歌自己的oauth2文檔,但沒有理解如何使這一切發生。

我確實有Android代碼,它使用AccountManager來確定給定手機上的哪個Google帳戶。我會提醒用戶,他們希望用哪個Google帳戶登錄,然後再獲取授權令牌。

過去這一點,我幾乎旋轉我的輪子。我看了看菜譜,似乎需要我我做這種形式的HTTP GET:

http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken> 

...其中(a)是不滿意的,因爲它似乎是具體到AppEngine上,我要自由(b)即使嘗試使用appengine,我設置的appengine實例似乎根本沒有信號,即日誌顯示現在對它的查詢(我正在希望那麼someUrlIChoose url將會被某些東西調用)...因此沒有機會被告知令牌的有效性。

具體問題將包括:

  • 我該怎麼辦與身份驗證令牌......做我發送到我的服務器,並 不知爲什麼我的服務器聯繫谷歌驗證令牌的有效性 爲指定的帳戶?還是有一些backchannel 通信應該已經(在這個階段的 進程)起源於谷歌服務器通知我的服務器,這個令牌 有效(如果是這樣,我該如何設置)?或者其他的東西 ?
  • 我是否有權假定這個過程應該可以在任何後端的 上下文中執行(不僅僅是appengine)?
  • 是oauth2我應該用什麼(而不是oauth1,或其他 其他)?我讀過的每件事似乎暗示谷歌對 oauth2的支持是「實驗性的」......但我還沒有確定這樣的 斷言是現在的還是舊的;即使目前,谷歌有一個 保持各種產品永久非最終形式(例如 永久測試版)的歷史,所以我不知道該怎麼得出結論。
  • 中還有其他的相關...

回答

0

這是你loooking什麼?

大多數Android應用程序都有某種服務器端後端,用於保存和共享數據。即使是最基本的遊戲也需要記住它的 玩家的高分。當您構建後端時,您必須解決的一個問題是後端代碼如何知道它正在與哪個應用對話,以及該用戶使用該應用的人是誰。

您可能擁有用於與您的客戶端 應用程序通信的HTTP端點,但服務器端代碼如何確保誰將消息 發送給它?畢竟,任何人都可以從任何地方發送HTTP POST請求; 如果他們能猜出他們的 身份,他們能模仿你的用戶嗎?

要求用戶在移動設備上輸入用戶名和密碼的確是用戶不友好的。特別是,如果某人已安裝了您的應用並授權其使用互聯網並知道您的身份,則不應再煩惱他們。

事實證明,現在每個運行Android 2.2或更高版本的兼容設備上現在都可以使用Google Play服務,該服務基於使用Google帳戶,爲此問題提供了一個很好的 解決方案。

http://android-developers.blogspot.se/2013/01/verifying-back-end-calls-from-android.html

2

您必須導入谷歌播放,services_lib比後您可以使用此代碼:

import com.google.android.gms.auth.GoogleAuthUtil; 
import com.google.android.gms.auth.UserRecoverableAuthException; 

private void gmail_login() { 

    dialog = ProgressDialog.show(LoginActivity.this, "", getString(R.string.login_loading), true); 

    AsyncTask task = new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... params) { 
       getAndUseAuthTokenBlocking(); 
      return null; 
     } 
    }; 
    task.execute((Void)null); 
} 


void getAndUseAuthTokenBlocking() { 
    try 
    { 
     String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email"; 
     AccountManager accountManager = AccountManager.get(this); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 

     String token = GoogleAuthUtil.getToken(this, accounts[0].name, AUTH_TOKEN_TYPE); 
     //token here 
    } 
    catch (UserRecoverableAuthException userAuthEx) { 
     startActivityForResult(userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE); 
    }catch (Exception e){ 
     DropErrorMsg.drop(this, handler, R.string.connection_error, R.string.error, dialog, false); 
    } 
}