我會解釋我如何最終做到這一點,以防止他人幫助他人。
我打電話給我的用戶的經理,我必須爲每個用戶管理器實體:
class Manager(ndb.Model):
user_account = ndb.StructuredProperty(UserAccount))
linked = ndb.BooleanProperty(default=False)
user = ndb.UserProperty()
的user
屬性是我將擺脫的老用戶服務帳戶。該user_account
屬性存儲信息來識別的oauth2帳戶:
class UserAccount(ndb.Model):
provider = ndb.StringProperty(required=True)
id = ndb.StringProperty(required=True)
name = ndb.StringProperty()
email = ndb.StringProperty()
從本質上講,每一個經理,我要爲user_account
(的oauth2登錄)的值,並刪除user
(舊用戶帳戶)。我想以最小的經理負擔來做到這一點。
當用戶最近以舊用戶帳戶登錄時,該cookie將被激活。但是,現在用戶正在使用Oauth2帳戶登錄。在使用Oauth2登錄後,我們檢查舊用戶帳戶cookie是否仍然有效。如果是這樣,我們會自動合併帳戶。這是處理程序的草圖。
class ManagerPage(webapp2.RequestHandler):
def get(self):
# This returns a Manager entity after the user has logged in with
# Oauth2. If the user is logging in for the first time, this will
# be a blank Manager entity.
self.get_manager()
# Temporary processing to link accounts. If the user is still logged
# as a Google user (because that cookie hasn't expired), then we
# automatically transfer their old information to the new Manager
# entity. In doing the conversion below, manager.linked is set to
# True so this can't happen more than once. Now that the Manager
# entity has been updated, redirect back to the same page.
gae_user = users.get_current_user()
if not manager.linked and gae_user:
manager.convert_old_manager(gae_user)
self.redirect("/manager")
# Present info to the manager
...
template = JINJA_ENVIRONMENT.get_template("manager.html")
self.response.write(template.render(template_values))
如果舊用戶帳戶的cookie不活躍,那麼我在詢問用戶的舊賬與新帳戶鏈接上述管理器頁面的鏈接。當用戶使用舊帳戶登錄時,它們將被重定向到上述管理頁面,並且該帳戶會自動鏈接。
嗨@RushyPanchal,這兩個問題都是我的,都是明顯不同的。不知道爲什麼你認爲他們是相同的... –
他們都問如何過渡到OAuth2,@Kekito。他們似乎沒有太大的不同,但我可能是錯的。 –
@RushyPanchal,我已經回答了這兩個問題。如果你認爲這是一個重複的問題,請閱讀並告訴我。 –