我将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
(而不是定义可能会更改和取消身份验证的路径前缀)?
答案 0 :(得分: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
。
答案 1 :(得分:1)
您只需创建一个只在该路径以account开头时才执行操作的处理程序。这应该工作。
shelf.Handler _accountHandler(shelf.Handler innerHandler) {
return (shelf.Request request) {
if (request.url.path.startsWith("/account")) {
/// do something here
}
return innerHandler(request);
};