2012-06-24 73 views
15

我開始編寫一個應用程序,通過一系列使用JSON的Web API調用,移動應用程序(Android/IPhone)將與GAE後端(Python)進行通信。使用Android/iPhone在Google App Engine上處理會話

我無法使用Google帳戶進行身份驗證,因此我需要實施自己的身份驗證。我對如何做到這一點有了一個想法,但我不確定是否有更好的方法。

任何人都可以幫助一些代碼示例/如何實現以下請求的建議嗎?

方法

  1. 移動應用程序調用該驗證,並在此店的會話密鑰,這將返回到應用程序服務器上的登錄方法 - 不知道如何生成密鑰/會話或應該是哪裏的請求/響應。
  2. 在每次調用時,應用都會將該密鑰傳遞給服務器以進行身份​​驗證,並允許該操作通過。
  3. 用戶不必再次登錄移動設備,除非他們明確註銷或丟失密鑰。

登錄方法 - 無密鑰生成

class Login(webapp.RequestHandler): 
def post(self): 
    args = json.loads(self.request.body) 
    email = args['e'] 
    pwd = args['p'] 
    ret = {} 
    user = User.gql('WHERE email = :1', email).get() 
    if user and helpers.check_password(pwd, user.password): 
     ret['ret_code'] = 0 
     ret['dn'] = user.display_name 
    else: 
     ret['ret_code'] = 1 

    self.response.headers['Content-Type'] = 'application/json' 
    self.response.out.write(json.dumps(ret)) 
+0

你在看OAuth嗎?這種事情似乎很標準。 –

回答

0

看一看與會議,權威性和JSON

1

我認爲你應該使用webapp2的提供實現的功能而webapp2和webapp2的演員您自定義註冊。

from webapp2_extras import auth 
from google.appengine.api import users 

class RegisterHandler(webapp2.RequestHandler): 
    def post(self): 
     email=self.request.POST['email'] 
     password=self.request.POST['password'] 

     #Let webapp2 handle register and manage session 
     user = auth.get_auth().store.user_model.create_user('own:'+str(email), password_raw=password,email=email) 
     #user (True, User(key=Key('User', 80001), auth_ids=[u'own:[email protected]'],email='[email protected]',password=u'hashed_password',...)) 

     if not user[0]: #user is a tuple 
      self.response.write(user[1]) # Error message 
     else: 
      #You can extend your User Model e.g UserProfile(User): or have a UserProperty in your profile model as the example. 
      profile=UserProfile(user=users.User(user[1].email)).put() 

      self.response.write(str(profile.key())) 
class LoginHandler(webapp2.RequestHandler): 

    def post(self): 

     email = self.request.POST.get('email') 
     email = self.request.POST.get('password') 
     # Try to login user with password 
     # Raises InvalidAuthIdError if user is not found 
     # Raises InvalidPasswordError if provided password doesn't match with specified user 
     try: 
      auth.get_auth().get_user_by_password('own:'+email, password) 
      #Return user_session with User id, 
     except InvalidPasswordError, InvalidAuthIdError: 
      #Error 

可以檢查用戶登錄方式:

if auth.get_user_by_session(): 
    #Logged in  
else: 
    #Not logged in 

在您的客戶端應用程序(安卓,IOS)。您只需存儲響應cookie並將其發送給每個子序列請求。

祝你好運:)

0

我不明白你爲什麼會需要一個會議? App引擎上的會話被保存在數據存儲中,因此如果您可以保留您的請求無狀態,我鼓勵您這樣做。

由於您將擁有自己的用戶服務來驗證用戶身份,我建議您使用摘要式身份驗證,因爲祕密不會包含在請求中。

對於大多數客戶端和服務器平臺,有一些庫實現Digest。

0

如果你不明確地想要使用會話等,你可以簡單地使用數據存儲。請嘗試以下操作:

  1. 獲取唯一的設備ID /電子郵件以標識每個唯一用戶。
  2. 根據特定用戶的請求,生成隨機認證密鑰,並將其附加到用戶的電子郵件/設備ID,可能還包括當前時間戳和登錄標誌。

所以你必須:

User email/id: [email protected] 
password: xxxxxxxxxx 
Key : 2131231312313123123213 
Timestamp: 20:00 12-02-2013 
loggedIn : boolean value 

這可能是數據庫模型。現在,無論何時用戶登錄:

  • 檢查電子郵件,密碼組合。
  • 如果有效,生成隨機密鑰,並更新數據存儲與當前時間新的密鑰
  • 更新時間戳,並設置的loggedIn
  • 現在返回鍵回到到JSON對象中的客戶端(Android/iPhone)。

現在每個請求,檢查對一個在你的數據存儲接收到的密鑰,如果的loggedIn標誌設置爲true。如果兩個都OK,處理請求。

此外,在註銷:

  • 只需設置數據存儲中的的loggedIn標誌假。

希望這有助於:)

0

嘗試gae-sessions會話管理。它爲您創建安全的Cookie,並允許您輕鬆地將數據與每個用戶相關聯。只需提供您自己的初始身份驗證邏輯即可。

它專爲App Engine構建,非常流行且超級快速/可擴展。

https://github.com/dound/gae-sessions

0

有很多方法可以做到這一點。

1)當您檢查用戶登錄詳細信息時,如果它檢出,您可以隨後創建一個隨機UUID或字符串,並將該用戶對象存儲在memcache中,其中隨機字符串作爲鍵和用戶對象作爲值。然後將隨機字符串與您的響應標題一起返回。在解析響應時在移動設備上,獲取此標頭並將其存儲在本地緩存中。在所有進一步的請求中,繼續將這個密鑰發送回請求頭,並在你的控制器中使用這個密鑰從memcache中獲取User對象並繼續。如果對象不在memcache中,您可以發送迴應,提示用戶登錄。

2)如果您不想使用memcache,可以在解析時將用戶對象存儲在會話和客戶端響應從響應中獲得會話標識。它通常是JSESSIONID。然後保存並重新發送請求。在控制器中,您可以檢查當前會話是否具有其他用戶對象強制登錄。

1)另一種方法是將響應的appengine鍵和響應一起返回並重新發送。

只需從響應中獲取響應標題即可。然後獲取SESSIONID/JSESSIONID標頭,存儲並將相同名稱和值的字段添加到所有其他請求標頭。這是最簡單的方法。

我的第一個答案在stackoverflow和沒有代碼exapmles,dangit如果只有我知道python。

相關問題