Использование dart RPC и shelf_auth для некоторых процедур
Я использую dart-lang/rpc
с shelf_rpc
пакет.
Некоторые из моих ресурсов требуют аутентификации. Я решил пойти с JWT и хочу использовать JwtSessionHandler
от shelf_auth
,
Моя упрощенная настройка выглядит так:
final ApiServer _apiServer = new ApiServer();
main() async {
var loginMiddleware = authenticate([new UsernamePasswordAuthenticator(lookupByUsernamePassword)],
sessionHandler: new JwtSessionHandler('my app', 'shhh secret', usernameLookup), allowHttp: true);
_apiServer.addApi(new Api());
// Create a Shelf handler for your RPC API.
var apiHandler = shelf_rpc.createRpcHandler(_apiServer);
var apiRouter = shelf_route.router()
..add('/api', null, apiHandler, exactMatch: false);
var handler = const shelf.Pipeline()
.addMiddleware(loginMiddleware)
.addMiddleware(shelf.logRequests())
.addHandler(apiRouter.handler);
var server = await shelf_io.serve(handler, '0.0.0.0', 8087);
}
/// Stub implementation
lookupByUsernamePassword(String username, String password) async =>
new Some(new Principal(username));
/// Stub implementation
usernameLookup(String username) async =>
new Some(new Principal(username));
Как я могу только добавить loginMiddleware
на запросы, которые начинаются с /account
(например)? Или даже лучше: возможно ли определить loginMiddleware
на самом ресурсе RPC (вместо определения префикса пути, который потенциально может изменить и аннулировать аутентификацию)?
2 ответа
Вы бы просто создали обработчик, который делает что-то, только когда этот путь начинается с учетной записи. Это должно работать.
shelf.Handler _accountHandler(shelf.Handler innerHandler) {
return (shelf.Request request) {
if (request.url.path.startsWith("/account")) {
/// do something here
}
return innerHandler(request);
};
Я нашел решение, хотя оно не кажется самым чистым.
Вместо добавления loginMiddleware
к конвейеру, я добавляю его в маршрут следующим образом:
var apiRouter = shelf_route.router()
..add('$_API_PREFIX/v1/account', null, apiHandler, exactMatch: false, middleware: loginMiddleware)
..add('$_API_PREFIX', null, apiHandler, exactMatch: false);
Это регистрирует apiHandler дважды, но первый маршрут только совпадает /account
маршруты, и добавляет loginMiddleware
,