如何在Flask中实现令牌认证?

发布于 2021-01-29 15:08:00

我试图允许用户使用他们的帐户通过单独的Web服务登录我的Flask应用。我可以联系此Web服务的api并接收安全令牌。如何使用此令牌对用户进行身份验证,以便他们可以访问受限视图?

我不需要将用户保存到我自己的数据库中。我只想验证他们的会话。我相信可以使用Flask-
Security和@auth_token_required装饰器完成此操作,但是文档不是很详细,我不确定如何实现。

编辑:

这是一个代码示例:

@main.route("/login", methods=["GET", "POST"])
def login():

    payload = {"User": "john", "Password": "password123"}
    url = "http://webserviceexample/api/login"
    headers = {'content-type': 'application/json'})

    #login to web service
    r = requests.post(url, headers=headers, json=payload)
    response = r.json()

    if (r.status_code is 200):
        token = response['user']['authentication_token']

        # allow user into protected view

    return render_template("login.html", form=form)


@main.route('/protected')
@auth_token_required
def protected():
    return render_template('protected.html')
关注者
0
被浏览
79
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    嘿,Amedrikaner!

    看来您的用例很简单,我们可以自己实现。在下面的代码中,我将在用户会话中存储您的令牌,并签入新包装。让我们开始制作自己的包装器,我通常只是将它们放在wrappers.py文件中,但是可以将其放置在所需的位置。

    def require_api_token(func):
        @wraps(func)
        def check_token(*args, **kwargs):
            # Check to see if it's in their session
            if 'api_session_token' not in session:
                # If it isn't return our access denied message (you can also return a redirect or render_template)
                return Response("Access denied")
    
            # Otherwise just send them where they wanted to go
            return func(*args, **kwargs)
    
        return check_token
    

    凉!

    现在我们已经实现了包装器,我们只需将其令牌保存到会话中即可。超级简单。让我们修改您的功能…

    @main.route("/login", methods=["GET", "POST"])
    def login():
    
        payload = {"User": "john", "Password": "password123"}
        url = "http://webserviceexample/api/login"
        headers = {'content-type': 'application/json'})
    
        #login to web service
        r = requests.post(url, headers=headers, json=payload)
        response = r.json()
    
        if (r.status_code is 200):
            token = response['user']['authentication_token']
    
            # Move the import to the top of your file!
            from flask import session
    
            # Put it in the session
            session['api_session_token'] = token
    
            # allow user into protected view
    
        return render_template("login.html", form=form)
    

    现在,您可以使用@require_api_token包装器检查受保护的视图,如下所示…

    @main.route('/super_secret')
    @require_api_token
    def super_secret():
        return "Sssshhh, this is a secret"
    

    编辑 哇!我忘了提到您需要在应用程序配置中设置SECRET_KEY。

    只需使用SECRET_KEY =“ SOME_RANDOM_STRING”的config.py文件即可。然后加载…

    main.config.from_object(config)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看