2015-08-27 4 views
5

Używam pakietu dart-lang/rpc z pakietem shelf_rpc.Używanie rzutki RPC i shelf_auth do niektórych procedur

Niektóre z moich zasobów wymagają uwierzytelnienia. Postanowiłem przejść z JWT i chcę użyć JwtSessionHandler z shelf_auth.

Moja uproszczona konfiguracja wygląda następująco:

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)); 

Jak tylko dodam loginMiddleware do wniosków, które zaczynają się /account (na przykład)? A nawet lepiej: czy możliwe jest zdefiniowanie loginMiddleware w samym zasobie RPC (zamiast zdefiniowania prefiksu ścieżki, który może potencjalnie zmienić i unieważnić uwierzytelnianie)?

+1

Dobre pytanie. Nigdy nie korzystałem z pakietu rpc, ale ponieważ nie jest to pakiet natywny (tylko zaadaptowany przez shelf_rpc), nie widzę sposobu, w jaki można w łatwy sposób używać dowolnego oprogramowania pośredniczącego na półki (takiego jak uwierzytelnianie) w dowolnym miejscu zasobów rpc. – Anders

Odpowiedz

1

Znalazłem rozwiązanie, chociaż nie wydaje się być najczystsze.

Zamiast dodawania loginMiddleware do rurociągu, dodaję go do trasy tak:

var apiRouter = shelf_route.router() 
    ..add('$_API_PREFIX/v1/account', null, apiHandler, exactMatch: false, middleware: loginMiddleware) 
    ..add('$_API_PREFIX', null, apiHandler, exactMatch: false); 

ten rejestruje apiHandler dwa razy, ale pierwsza trasa pasuje tylko /account tras i dodaje loginMiddleware.

1

Po prostu utworzysz program obsługi, który robi coś tylko wtedy, gdy ścieżka zaczyna się od konta. To powinno działać.

shelf.Handler _accountHandler(shelf.Handler innerHandler) { 
    return (shelf.Request request) { 
    if (request.url.path.startsWith("/account")) { 
    /// do something here 
    } 
    return innerHandler(request); 
}; 
Powiązane problemy