2015-08-27 6 views
5

Sto usando dart-lang/rpc con il pacchetto shelf_rpc.Utilizzo di dardo RPC e shelf_auth per alcune procedure

Alcune delle mie risorse richiedono l'autenticazione. Ho deciso di andare con JWT e voglio usare lo JwtSessionHandler da shelf_auth.

La mia configurazione semplificata è simile al seguente:

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

Come posso aggiungere solo la loginMiddleware alle richieste che iniziano con /account (per esempio)? O ancora meglio: è possibile definire lo loginMiddleware sulla stessa risorsa RPC (invece di definire un prefisso del percorso che può potenzialmente modificare e annullare l'autenticazione)?

+1

Buona domanda. Non ho mai usato il pacchetto rpc da solo, ma poiché non è un pacchetto di scaffali nativo (adattato solo tramite shelf_rpc) non vedo come si possa facilmente utilizzare qualsiasi middleware di scaffale (come l'autenticazione) ovunque all'interno delle risorse di rpc. – Anders

risposta

1

Ho trovato una soluzione, anche se non sembra essere la più pulita.

Invece di aggiungere il loginMiddleware alla pipeline, lo aggiungo al percorso in questo modo:

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

questo modo si registra l'apiHandler due volte, ma il primo percorso corrisponde solo /account percorsi, e aggiunge il loginMiddleware.

1

Dovresti semplicemente creare un gestore che fa qualcosa solo quando quel percorso inizia con l'account. Questo dovrebbe funzionare.

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