使用 bottle-jwt 装饰器时遇到问题(不起作用)

Trouble using bottle-jwt decorator (not works)



使用此插件时遇到问题 https://github.com/agile4you/bottle-jwt/
它似乎没有像我预期的那样工作,低于我的代码:

import bottle
from Py.engine import *
from bottle_jwt import (JWTProviderPlugin, jwt_auth_required)

    class AuthBackend(object):
    user = {'id': 1237832, 'username': 'pav', 'password': '123', 'data': {'sex': 'male', 'active': True}}

    def authenticate_user(self, username, password):
        """Authenticate User by username and password.

        Returns:
            A dict representing User Record or None.
        """
        if username == self.user['username'] and password == self.user['password']:
            return self.user
        return None

    def get_user(self, user_id):
        """Retrieve User By ID.

        Returns:
            A dict representing User Record or None.
        """
        if user_id == self.user['id']:
            return {k: self.user[k] for k in self.user if k != 'password'}
        return None


app = bottle.Bottle()
server_secret = 'secret'

provider_plugin = JWTProviderPlugin(
    keyword='jwt',
    auth_endpoint='/login',
    backend=AuthBackend(),
    fields=('username', 'password'),
    secret=server_secret,
    ttl=30
)

app.install(provider_plugin)

@app.route('/')
@jwt_auth_required
def index():
    return open('Html/index.html', 'r').read()


@app.post('/login')
def login():
    return open('Html/login.html', 'r').read()


@app.get('/login')
def login():
    return open('Html/login.html', 'r').read()


def run_server():
    bottle.run(app=app, host='localhost', port=8080, debug=True, reloader=True)


# Main
if __name__ == '__main__':
    run_server()

一旦 运行,如果我在 127.0.0.1/8080 上打开浏览器,我会返回一个空白页面,其中包含字符串“{"AuthError": ["Cannot access this resource!"]}”
很好,这意味着我不允许打开 index.html 文件(酷:@jwt_auth_required 有效)
在源文件中挖掘我发现了一个名为 validate_token() 的函数:

if not token:
   logger.debug("Forbidden access")
   raise JWTForbiddenError('Cannot access this resource!')

这里是例外

except JWTForbiddenError as error:
       bottle.response.content_type = b('application/json')
       bottle.response._status_line = b('403 Forbidden')
       return {"AuthError": error.args}

那么,如果令牌不匹配或不存在,有没有办法在我的 login.html 页面上重定向我? 插件包括一些方法来做到这一点,或者只是一个 API pckg?


谢谢你的时间
和乐.

JWT 概念不应该这样使用。 JWT 适用于 RESTFul.

You need to make the server as REST API and on the client use JS libraries such as AngularJs / Vue.js etc.,

关于插件的问题:

provider_plugin = JWTProviderPlugin(
    keyword='jwt',
    auth_endpoint='/login',
    backend=AuthBackend(),
    fields=('username', 'password'),
    secret=server_secret,
    ttl=30
)

auth_endpoint='/login' 是为授权提供自定义端点,其中 Bottle_JWT 方法正在寻找凭据来验证和生成 JWT对于.

我创建了一个模拟只是为了构造一个响应,这就是它应该如何使用。

一旦您传递了正确的凭据,该插件就会使用 JWT 进行响应并过期,您必须在授权调用中拦截它并添加为请求headers

希望对您有所帮助。