2015-08-27 3 views
5

मैं पैकेज shelf_rpc पैकेज के साथ उपयोग कर रहा हूं।कुछ प्रक्रियाओं के लिए डार्ट आरपीसी और शेल्फ_एथ का उपयोग

मेरे कुछ संसाधनों को प्रमाणीकरण की आवश्यकता है। मैंने JWT के साथ जाने का फैसला किया और JwtSessionHandlershelf_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)); 

कैसे मैं केवल अनुरोध करता है कि (उदाहरण के लिए) /account साथ शुरू करने के लिए loginMiddleware जोड़ सकते हैं? या इससे भी बेहतर: क्या आरपीसी संसाधन पर loginMiddleware को परिभाषित करना संभव है (पथ उपसर्ग को परिभाषित करने के बजाय जो संभावित रूप से बदल सकता है और प्रमाणीकरण रद्द कर सकता है)?

+1

अच्छा सवाल। मैंने कभी भी आरपीसी पैकेज का उपयोग नहीं किया है, लेकिन चूंकि यह मूल शेल्फ पैकेज नहीं है (केवल शेल्फ_आरपीसी के माध्यम से अनुकूलित किया गया है) मैं नहीं देखता कि आप अपने आरपीसी संसाधनों के भीतर कहीं भी किसी भी शेल्फ मिडलवेयर (जैसे प्रमाणीकरण) का उपयोग कैसे कर सकते हैं। – Anders

उत्तर

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

आप केवल एक हैंडलर बनाएंगे जो उस पथ को खाते के साथ शुरू होने पर ही कुछ करता है। यह काम करना चाहिए।

shelf.Handler _accountHandler(shelf.Handler innerHandler) { 
    return (shelf.Request request) { 
    if (request.url.path.startsWith("/account")) { 
    /// do something here 
    } 
    return innerHandler(request); 
}; 
संबंधित मुद्दे