【问题标题】:Trouble using bottle-jwt decorator (not works)使用 bottle-jwt 装饰器的麻烦(不起作用)
【发布时间】:2019-07-01 11:52:04
【问题描述】:



使用此插件时遇到问题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”:[“无法访问此资源!”]}“
这很好,这意味着我不允许打开 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?


谢谢你的时间
赫勒。

【问题讨论】:

    标签: python login jwt bottle


    【解决方案1】:

    这不是应该如何使用 JWT 概念的。 JWT 用于 RESTFul。

    您需要将服务器设置为 REST API,并在客户端使用 JS AngularJs / Vue.js 等库,

    关于插件的问题:

    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 响应并过期,您必须在授权调用中拦截并添加为请求标头

    希望这会有所帮助。

    【讨论】:

    • 谢谢 :) 我自己已经解决了,但你的帖子澄清了我的一些疑问。祝你有美好的一天。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2016-03-14
    • 2020-11-09
    相关资源
    最近更新 更多