我正在使用 dart-lang/rpc 和 shelf_rpc 包. 我的一些资源需要身份验证.我决定使用JWT,并希望从 shelf_auth 开始使用JwtSessionHandler. 我的简化设置如下所示: final ApiServer _apiServer = new ApiServer();m
dart-lang/rpc
和
shelf_rpc
包.
我的一些资源需要身份验证.我决定使用JWT,并希望从shelf_auth
开始使用JwtSessionHandler.
我的简化设置如下所示:
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开头的请求(例如)?甚至更好:是否可以在RPC资源本身上定义loginMiddleware(而不是定义可能会更改和取消身份验证的路径前缀)?
我找到了一个解决方案,虽然它似乎并不是最干净的.我没有将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两次,但第一个路由只匹配/帐户路由,并添加loginMiddleware.