2015-08-25 70 views
0

我目前使用「Google Accounts API」來允許用戶登錄到我的GAE應用程序。因此,我使用users.create_login_url和users.get_current_user並將ndb.UserProperty添加到我自己的用戶實體,以便我可以檢索該用戶的數據。GAE:將用戶服務轉換爲oauth2

我現在正在切換到oauth2(使用authomatic)。

我需要將我所有的現有用戶帳戶轉換爲oauth2,並且希望爲用戶儘可能簡化操作。這是我目前的計劃:

  1. 將用戶服務的登錄更改爲oauth2。

  2. 用戶登錄後,它將看起來像一個新帳戶,用戶將看不到他或她以前的數據。

  3. 我會添加一條突出的消息,要求用戶使用舊用戶服務登錄。

  4. 然後,我會將舊用戶服務帳戶與oauth2帳戶合併。

這應該可以工作,但會對用戶造成一些困惑。有沒有更好的方法來做到這一點?

+0

嗨@RushyPanchal,這兩個問題都是我的,都是明顯不同的。不知道爲什麼你認爲他們是相同的... –

+0

他們都問如何過渡到OAuth2,@Kekito。他們似乎沒有太大的不同,但我可能是錯的。 –

+0

@RushyPanchal,我已經回答了這兩個問題。如果你認爲這是一個重複的問題,請閱讀並告訴我。 –

回答

1

我會解釋我如何最終做到這一點,以防止他人幫助他人。

我打電話給我的用戶的經理,我必須爲每個用戶管理器實體:

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不活躍,那麼我在詢問用戶的舊賬與新帳戶鏈接上述管理器頁面的鏈接。當用戶使用舊帳戶登錄時,它們將被重定向到上述管理頁面,並且該帳戶會自動鏈接。