2012-06-02 41 views
4

我在我的GAE應用程序中使用Alex(https://github.com/crhym3/simpleauth)的SimpleAuth。我在我的基本模板中有一個Jquery Powered登錄框,這意味着用戶可以從應用程序內部的任何URL登錄。我希望用戶重定向到他們請求登錄的頁面。有沒有什麼辦法可以通過Oauth2實現這一點,或者我們可以將用戶重定向到只有特定的網址?Google App Engine:SimpleAuth:重定向網址

回答

5

如果您使用的是SimpleAuth,我認爲您可能使用了webapp2,因此@ jmort253示例並不完全如何做(例如,webapp2具有內置會話,爲什麼還要使用另一個庫來處理會話) 。

雖然在概念上它是正確的:你需要的是在開始認證過程之前在會話的某個地方存儲原始URL。然後在成功驗證後,使用該存儲的URL進行最終重定向。

從SimpleAuth的示例應用程序代碼開始,基本上需要更改的是last line of _on_signin()將用戶重定向到它們來自的原始URL(而不是'/ profile')。

要存儲原始請求的URL,您可以使用簡單的包裝,例如現在

def simpleauth_login_required(handler_method): 
    """A decorator to require that a user be logged in to access a handler. 

    To use it, decorate your get() method like this: 


     @simpleauth_login_required 
     def get(self): 
      user = self.current_user 
      self.response.out.write('Hello, ' + user.name()) 
    """ 
    def check_login(self, *args, **kwargs): 
     if self.request.method != 'GET': 
      self.abort(400, detail='The login_required decorator ' 
       'can only be used for GET requests.') 

     if self.logged_in: 
      handler_method(self, *args, **kwargs) 
     else: 
      self.session['original_url'] = self.request.url 
      self.redirect('/my-login-page-where-users-can-choose-auth-method') 

    return check_login 

,要回那_on_signin()重定向線,而不是self.redirect('/profile')你會做這樣的事情:

target = self.session['original_url'] 
self.redirect(target) 

一對夫婦的注意事項:

  • 上面的例子假設您有一個logged_in方法,該方法指示當前請求是否由已驗證的用戶進行;
  • ,你可能會想從會話清除「original_url」(如果認證成功)

上述例子的學分去webapp2_extras.appengine.users module

+0

感謝Alex,我的確在使用webapp2,看到mort的例子後,我將它保存在webapp2會話中而不是另一個會話庫中。感謝這個偉大的例子! – Amyth

1

當您的用戶嘗試登錄時,您的應用首先請求訪問令牌,然後構建Google OAuth2 URL。您的應用將用戶重定向到您的用戶必須登錄的google.com。此登錄URL包含服務器對Google的請求中的訪問令牌。出於安全目的,它與該重定向URL綁定。

此重定向URL旨在通過向您的應用程序返回成功的登錄操作來完成登錄過程,以便您完成登錄用戶,註冊該用戶或執行任何應用程序需要執行的操作。

之後,球在你的球場上,你可以編程你的應用程序來做你想做的任何事情。換句話說,Google只關心將請求發送到您的安全端點。一旦完成,Google不再關心你的工作;這是你的應用程序。

因此,您的用戶重定向回頁面,他/她在登錄,這是一個真棒可用性改進之前,是要做到以下幾點:

步驟重定向用戶:

1在用戶登錄之前,將他/她所在的頁面存儲在會話中。

session = appengine_utilities.sessions.Session() 
session["target_url"] = "/example_page.html" # sets keyname to current page 

2下,繼續前進,記錄用戶的正常進行。

3之後谷歌將用戶重定向到您的驗證重定向URL,從session中獲取目標網址:

target_url = session['target_url'] 

4最後,用戶重定向到該網址。

總之,只要您首次接受來自Google的重定向到單個建立的重定向網址,您就可以實現將用戶重定向到任何目標網址的目標。

會話示例來自Beaker網站。此外,Nick Johnson's Webapps on Appengine Part 5博客文章潛入與燒杯會議。