web 认证

cookie

可以通过set_cookie和get_cookie来设置、获取cookie,当然,应该在application中设置cookie_sercret并通过get_secure_cookie和set_secure_cookie操作加密cookie。

默认的secure cookie过期时间是30天,可以在set_secure_cookie中通过设置expires_day和在get_secure_cookie中设置max_age_days。这两个参数分开设置,是有些情况,设置的expires_day的确未过期,但是对于一些敏感操作需要max_age_days的期限内。

user

通过self.current_user来获得当前用户,在模板中也可通过current_user获取,默认是None。如果需要实现自定义的认证系统则需要重载get_current_user。

class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        return self.get_secure_cookie("user")

class MainHandler(BaseHandler):
    def get(self):
        if not self.current_user:
            self.redirect("/login")
            return
        name = tornado.escape.xhtml_escape(self.current_user)
        self.write("Hello, " + name)

class LoginHandler(BaseHandler):
    def get(self):
        self.write('
' 'Name: ' '' '
') def post(self): self.set_secure_cookie("user", self.get_argument("name")) self.redirect("/") application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler), ], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__") class MainHandler(BaseHandler): @tornado.web.authenticated def get(self): name = tornado.escape.xhtml_escape(self.current_user) self.write("Hello, " + name) settings = { "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", "login_url": "/login", } application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler), ], **settings)

加了@tornado.web.authenticated装饰器的是需要登录的,如果当前用户没有登录则会重定向到登录页面。

https://github.com/tornadoweb/tornado/tree/stable/demos/blog

三方认证

class GoogleOAuth2LoginHandler(tornado.web.RequestHandler,
                            tornado.auth.GoogleOAuth2Mixin):

    @tornado.gen.coroutine
    def get(self):
        if self.get_argument('code', False):
            user = yield self.get_authenticated_user(
                redirect_uri='http://your.site.com/auth/google',
                code=self.get_argument('code'))
            # Save the user with e.g. set_secure_cookie
        else:
            yield self.authorize_redirect(
                redirect_uri='http://your.site.com/auth/google',
                client_id=self.settings['google_oauth']['key'],
                scope=['profile', 'email'],
                response_type='code',
                extra_params={'approval_prompt': 'auto'})

csrf

settings = {
    "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
    "login_url": "/login",
    "xsrf_cookies": True,
}
application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/login", LoginHandler),
], **settings)

启用了csrf会设_xsrf cookie,所有提交的表单需要包含该项。

{% module xsrf_form_html() %}
function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined; } jQuery.postJSON = function(url, args, callback) { args._xsrf = getCookie("_xsrf"); $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", success: function(response) { callback(eval("(" + response + ")")); }}); };

如果需要改变csrf的认证方式,可以重载check_xsrf_cookie方法

你可能感兴趣的:(web 认证)