2010-10-07 32 views
8

Sadece Tornado ile oynamaya başladım ve birden çok kimlik doğrulama yöntemi sunmak istiyorum. Şu anda benim app tornado.auth.GoogleMixin kullanarak Google'ın hibrid OpenID/oAuth ile çalışıyor ve kimliği doğrulanmamış kullanıcılar otomatik olarak Google'ın auth sayfasına gönderilir.Tornado ile çoklu kimlik doğrulama seçenekleri

Kimliği doğrulanmamış bir kullanıcı başka bir seçenek kullanmak isterse (ör. Yerel auth veya tornado.auth.TwitterMixin), oturum açma işleyicisinde bir auth mekanizması seçmek için mantığı nasıl uygulayabilirim?

Tüm açık yöntemlerim için 'tornado.web.authenticated' dekoratörünü ekledim ve şu anda Google OpenID/oAuth ile çalışmakta olan oturum açma işleyici sınıfım (hemen hemen Tornado örneklerinden):

class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin): 
    @tornado.web.asynchronous 
    def get(self): 

     if self.get_argument('openid.mode', None): 
      self.get_authenticated_user(self.async_callback(self._on_auth)) 
      return 

     ## redirect after auth 
     self.authenticate_redirect() 

    def _on_auth(self, user): 
     ## auth fail 
     if not user: 
      raise tornado.web.HTTPError(500, 'Google auth failed') 

     ## auth success 
     identity = self.get_argument('openid.identity', None) 

     ## set identity in cookie 
     self.set_secure_cookie('identity', tornado.escape.json_encode(identity)) 
     self.redirect('/') 

Çözüm önerileri için teşekkür ederiz. basitçe Sonra

(r"/login/google/", GoogleAuthHandler), 
(r"/login/facebook/", FacebookAuthHandler), 

vb

: Teşekkürler

cevap

11

Ben GoogleAuthHandler gibi daha özel bir şey için AuthLoginHandler değiştirmek ve bunun için uygun bir rota oluşturmak için olacağını yapmanın en kolay yolu düşünüyorum

<a href="/login/google/>Login with Google</a> 
<a href="/login/facebook/">Login with Facebook</a> 

bunu meraklısı, bir seçme olarak sağlayıcıları sağlayabilir yapmak isteseydim: sayfa ala her kimlik doğrulama sağlayıcısına bağlantılar oluşturmak kutusunu veya gerçekten GERÇEKTEN almak istediyseniz, 'openid' URL'lerini (örneğin, username.google.com, self.redirect ("/ login/google") ise) ayrıştırabilirsiniz. Ancak, kullanıcılar OpenID sağlayıcısını bilirler. Genellikle durum böyle değil. Bir google/facebook/twitter simgesi ya da en az kişi sayısını karıştıracak bir şey verdiyseniz onlara tahmin edersiniz.

+0

Yardımlarınız için teşekkür ederiz. – joet3ch

0

Bu probleme kendim geldim ama biraz farklı bir durumda.

Bir çözüm aslında böyle bir şey yapmaktır.

class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin, tornado.auth.TwitterMixin): 

    def get(self): 
     if want_google: 
      tornado.auth.GoogleMixin.get_authenticated_user(self) 
      #... 
     elif want_twitter: 
      tornado.auth.TwitterMixin.get_authenticated_user(self) 
     #... 
İlgili konular