2012-06-16 40 views
1

我有一個應用程序,允許用戶使用Oauth2進行身份驗證,甚至自定義用戶註冊。所有用戶都保存到數據存儲區中的默認用戶實體中。如果用戶登錄使用的oauth2首次在默認用戶實體的新紀錄是這樣創建的:Google App Engine(Python):使用UserProperty和Webapp2用戶模型

"""Check if user is already logged in""" 
    if self.logged_in: 
    logging.info('User Already Logged In. Updating User Login Information') 
    u = self.current_user 
    u.auth_ids.append(auth_id) 
    u.populate(**self._to_user_model_attrs(data, self.USER_ATTRS[provider])) 
    u.put() 
    else: 
    """Create a New User""" 
    logging.info('Creating a New User') 
    ok, user = self.auth.store.user_model.create_user(auth_id, **self._to_user_model_attrs(data, self.USER_ATTRS[provider])) 

    if ok: 
     self.auth.set_session(
     self.auth.store.user_to_dict(user) 
    ) 
self.redirect(continue_url) 

定製的註冊記錄是通過以下處理程序插入。

class RegistrationHandler(TemplateHandler, SimpleAuthHandler): 

    def get(self): 
    self.render('register.html') 

    def post(self): 
    """Process registration form.""" 
    user = 'appname:%s' % self.request.get('email') 
    name = '%s %s' % (self.request.get('first_name'), self.request.get('last_name')) 
    password = self.request.get('password') 
    avatar = self.request.get('avatar') 
    act_url = user_activation.Activate(self.request.get('first_name'), self.request.get('email')) 
    ok, user = User.create_user(auth_id=user, name=name, password_raw=password, email=self.request.get('email')) 
    if ok: 
     self.auth.set_session(self.auth.store.user_to_dict(user)) 
     acc = models.Account(display_name=self.request.get('first_name'), act_url=act_url, act_key=act_url.split('activate/')[1], user=users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).email)) 
     acc.put() 
     if avatar: 
     avt = models.Picture(is_avatar=True, is_approved=True, image=avatar, user=users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).email)) 
     avt.put() 
    self.redirect('/') 

現在我們使用webapp2_extras.sessions進行會話處理。我們有不同的模型,如評論,圖片,評論等,我們希望使用db.UserProperty()作爲作者字段。但是,只要我們使用'users.get_current_user()'將記錄輸入到任何這些模型中,作者字段就會顯示空白或無。我認爲這是因爲我們正在通過webapp2會話處理會話。

我們希望實現的目標是能夠在各種模型中使用db.UserProperty字段,並使用webapp2會話適當地鏈接到當前用戶?

UserProperty()必須與用戶對象一起傳遞,以便正確插入記錄。儘管我們可以使用下面的代碼輸入記錄:

user = users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).email) 

user = users.User(User.get_by_auth_id(self.current_user.auth_ids[0]).name) 

但我們不能夠通過參考model.author

讓整個用戶對象

任何想法我們應該如何實現?

回答

2

而不是使用UserProperty存儲對webapp2用戶對象的引用,而應該將auth_id存儲爲StringProperty,並添加一個便捷方法來獲取相應的webapp2用戶實體。

像這樣的事情

from webapp2_extras.appengine.auth.models import User 

class Comment(db.model): 
    text = db.StringProperty() 
    author = db.StringProperty() 

    def get_author(self): 
    return User.get_by_auth_id(self.author) 
+0

從https://developers.google.com/appengine/docs/python/users/userobjects的谷歌App Engine的文件 - 「無論是db和NDB庫有UserProperty屬性類型,以便應用程序可以存儲用戶值,但是,由於**這些值在用戶更改電子郵件地址時變爲無效**,因此大多數應用程序對此功能沒有好用。 –

4

OAuth 2.0目前不支持Users service。支持的選項是

  • 谷歌帳戶
  • 的OpenID
  • 的OAuth 1.0

我不坦率地明白你在代碼庫引入db.User完成的任務。鑑於有self.current_user,我假設你已經處理認證過程。

當你做self.auth.store.user_model.create_user - 已經給你一個webapp2的用戶對象/實體(它與db.User沒有任何關係)。我相信這就是您必須使用OAuth 2.0約束條件的作者字段。

users.get_current_user()依賴於特殊的Cookie(App Engine內部)。事實上,它與webapp2的會話(或其他任何「定製」會話)無關。您可以通過將Cookie設置爲App Engine內部可以理解並被欺騙的值來進行破解,就好像用戶使用我提到的某種方法登錄一樣,但我不會推薦這種方法。它沒有記錄(cookie名稱,格式等),並可能隨時更改。

相關問題