Использование 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,

Другие вопросы по тегам