Flask 构建 Web API Wheel(九)—— 认证授权

Updated on in Python with 851 views

在 API 服务中使用令牌作为用户身份校验的凭证。Flask-HTTPAuth 为我们提供了不同类型的认证方法。

身份认证

verify_token() 用于校验 Token,generate_token() 用户生成 Token

# lib/token.py
auth = HTTPTokenAuth(scheme='Token')

@auth.verify_token
def verify_token(token):
    s = Serializer(
        secret_key=current_app.config['SECRET_KEY'],
        expires_in=current_app.config['EXPIRES_IN']
    )
    try:
        data = s.loads(token)
    except BadSignature:
        raise TokenInvalid
    except SignatureExpired:
        raise TokenExpired
    g.user_id = data['user_id']
    return True


def generate_token(user_id):
    s = Serializer(
        secret_key=current_app.config['SECRET_KEY'],
        expires_in=current_app.config['EXPIRES_IN']
    )
    token = s.dumps({
        'user_id': user_id,
    })
    return token.decode('ascii')

使用时通过在请求方法上增加 @auth.login_required 注解即可

@api.route('', methods=['GET'])
@auth.login_required
def get_users():
    """
    分页查询用户
    """
    pagination = User.get_pagination().append('update_time', 'delete_time')
    return Success(data=paginator_schema(pagination))

请求头校验

在项目部署后我们经常会收到许多来自不同国家流量的拜访,为了避免这种情况给我们带来不必要的麻烦,可以增加一个与前端约定好的请求头,来阻挡一部分流量,对其直接返回。

def register_request(app):
    @app.before_request
    def header_validator():
        if 'APP_NAME' in app.config:
            if 'X-App-Name' in request.headers:
                if request.headers['X-App-Name'] != app.config['APP_NAME']:
                    raise HeaderInvalid
            else:
                raise HeaderInvalid

但最重要的还是开发和运维人员要有很强的安全意识才行。

前端调用

前端调用时候需要填写上述的两个请求头:

X-App-Name: FLASK-TEA
Authorization: Token eyJhbGciOiJIUzUxMiIsImlhdCI6MTYxMzI3OTgzMywiZXhwIjoxNjEzODg0NjMzfQ.eyJ1c2VyX2lkIjoiNzZkMGUzMWQwOGJmNDFkZGEyYzRmYTc1Nzg4NjVlZGMifQ.Fls-CVfHRYKYae7cu01pBqTzZu9Zt6HGM_BQkXas5pMF039XhUwuWr6xlEd_vKVmhVEzUFFGfQgJ4tUnXCQ5Zw

标题:Flask 构建 Web API Wheel(九)—— 认证授权
作者:Jeffrey

Responses
取消