Python 如何在Flask中实现令牌身份验证?

Python 如何在Flask中实现令牌身份验证?,python,authentication,flask,flask-security,http-token-authentication,Python,Authentication,Flask,Flask Security,Http Token Authentication,我正在尝试允许用户使用他们的帐户从单独的web服务登录到我的Flask应用程序。我可以联系此web服务的api并接收安全令牌。如何使用此令牌对用户进行身份验证,以便他们能够访问受限视图 我不需要将用户保存到我自己的数据库中。我只想对它们进行会话身份验证。我相信这可以通过Flask Security和@auth_token_required decorator来实现,但是文档不是很详细,我不知道如何实现 编辑: 下面是一个代码示例: @main.route("/login", methods=["

我正在尝试允许用户使用他们的帐户从单独的web服务登录到我的Flask应用程序。我可以联系此web服务的api并接收安全令牌。如何使用此令牌对用户进行身份验证,以便他们能够访问受限视图

我不需要将用户保存到我自己的数据库中。我只想对它们进行会话身份验证。我相信这可以通过Flask Security和@auth_token_required decorator来实现,但是文档不是很详细,我不知道如何实现

编辑:

下面是一个代码示例:

@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')
嘿,阿梅德里坎纳

看起来您的用例非常简单,我们可以自己实现它。在下面的代码中,我将在用户会话中存储您的令牌,并签入一个新的包装器。让我们从制作我们自己的包装开始吧,我通常只把它们放在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\u api\u令牌包装器检查受保护的视图,如下所示

@main.route('/super_secret')
@require_api_token
def super_secret():
    return "Sssshhh, this is a secret"
编辑 哇!我忘了提到你需要在你的应用程序配置中设置你的密钥

只需一个带有SECRET\u KEY=“SOME\u RANDOM\u STRING”的config.py文件即可。然后把它装上

main.config.from_object(config)

您需要使用令牌存储用户;并根据服务确认令牌的有效性。否则,每次访客启动时,您都必须根据第三方服务对其进行身份验证。您指的是每次会话吗?如果是这样的话,他们就必须再次进行身份验证。这是个问题吗?这正是我想要的。谢谢你,布考!我们是只需要这两个元素,还是应该没有其他功能来根据数据库验证用户凭据?@EvanBurbidge很抱歉回复太晚。此实现专门用于根据其他地方的外部API对用户进行身份验证。如果你想遵循标准的用户登录流程,请查看此链接以获取更多信息@FBoucaut感谢再次联系!!实际上,我开始使用node,并使用基于令牌的auth制作了一个非常好的用户登录/注册/注销包!决定一直保留所有JS:)我对构建类似于此的身份验证感兴趣。任何人都可以提供一些信息来说明认证API是如何工作的。或者提供一个资源链接,解释如何构建这样的API。谢谢