嗨,伙计们,我用了几天的时间,希望你们中的一些人能弄清楚
我有像这样的简单响应模式的 lambda 授权器。
我想将 JWT 令牌(user_id)中的值转发到我的 Flask API。
我的授权人工作正常,但我不知道在 Flask API 中访问 authorizer.claims。
exports.handler = async(event) => {
const method = 'main';
log.info(`[${method}] BEGIN`);
log.info(`[${method}] incoming event= ${JSON.stringify(event)}`);
const secret = await secretManager(secretName);
const response = {
isAuthorized: false,
context: {
authorizer: {
claims: {}
},
error: {}
}
};
const authorization = event.headers.authorization;
if(!authorization){
log.error(`[${method}] No authorization found`);
response.context.error.message = 'No authorization found';
response.context.error.responseType = 401;
return response;
}
const auth = authorization.split(' ');
if (auth[0] !== 'Bearer' || auth.length !== 2) {
log.error(`[${method}] Invalid authorization`);
response.context.error.message = 'Invalid authorization';
response.context.error.responseType = 401;
return response;
}
try {
const decoded = verify(auth[1], secret.public_key, {
algorithms: ['RS512'],
});
response.isAuthorized = true;
response.context.authorizer.claims = decoded;
} catch (error) {
log.error(`[${method}] Error occured:${error.message}`);
response.isAuthorized = false;
response.context.error.message = error.message;
response.context.error.responseType = 401;
}
log.info(`[${method}] END`);
return response;
};
我的 Flask 应用程序是这样的。
我使用 blueprint 和 app.before_request_funcs 作为中间件。
from api.middlewares.fetchUser import fetchUser
from api.routes.blueprint import myBlueprint
app.before_request_funcs = {
myBlueprint.name: [fetchUser]
}
app.register_blueprint(myBlueprint)
这是我想在我的 API 启动之前访问 authorizer.claims 以获取用户的地方。
from flask import request, g
from api.utils.logger import logger
import json
def fetchUser():
logger.warn('FETCH USER')
logger.warn(json.dumps(request.headers.to_wsgi_list()))
logger.warn(json.dumps(request.authorization))
如何访问 authorizer.claims
谢谢。