5

我正在使用dart-lang/rpcshelf_rpc软件包。

我的一些资源需要身份验证。我决定使用JWT并想使用JwtSessionHandlerfrom 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 资源本身上定义(而不是定义可能会更改和取消身份验证的路径前缀)?

4

2 回答 2

1

我找到了一个解决方案,虽然它似乎不是最干净的。

我没有将其添加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.

于 2015-08-28T17:47:15.900 回答
1

您只需创建一个处理程序,该处理程序仅在该路径以帐户开头时才执行某些操作。这应该有效。

 shelf.Handler _accountHandler(shelf.Handler innerHandler) {
   return (shelf.Request request) {
   if (request.url.path.startsWith("/account")) {
   /// do something here
   }
   return innerHandler(request);
 };
于 2016-06-21T02:42:12.403 回答