2015-10-18 10 views
12

का उपयोग करके प्रमाणीकरण कैसे करें akka HTTP का उपयोग करके प्रमाणीकरण कैसे करें पर एक अच्छी व्याख्या की तलाश है। एक मार्ग है कि लग रहा हैअक्का HTTP

val route = 
    path("account") { 
    authenticateBasic(realm = "some realm", myAuthenticator) { user => 
     get { 
     encodeResponseWith(Deflate) { 
      complete { 
      //do something here 
      } 
     } 
     } 
    } 
    } 

The documentation एक तरह से की रूपरेखा है, लेकिन फिर उचित हिस्सा वास्तविक प्रमाणीकरण प्रदर्शन कर छोड़ दिया जाता है की तरह ...

// backend entry points 
def myAuthenticator: Authenticator[User] = ??? 

मैं इस तरह के एक प्रमाणक का एक उदाहरण दिया गया कहां मिल सकती है यह देखते हुए ? मेरे पास उपयोगकर्ता नाम और पासवर्ड दिए गए उपयोगकर्ता को प्रमाणीकृत करने के लिए पहले ही तर्क है, लेकिन मुझे यह नहीं पता कि HTTP अनुरोध (या RequestContext) से उपयोगकर्ता नाम/पासवर्ड (या दोनों युक्त टोकन) कैसे प्राप्त किया जाए।

उत्तर

8

प्रमाणक सिर्फ एक समारोह UserCredentials => Option[T], जहां UserCredentials जा रहा है के मामले में (पैटर्न मिलान के साथ जांच) है Provided है verifySecret(secret) विधि है जो आप सुरक्षित रूप से कहते हैं और सफलता के मामले में Some (उदाहरण के लिए कुछ उपयोगकर्ता) लौटने के लिए, की तरह की जरूरत है:

def myAuthenticator: Authenticator[User] = { 
    case [email protected](username) => 
    if(p.verifySecret(myGetSecret(username))) Some(username) else None 
    case Missing => None //you can throw an exeption here to get customized response otherwise it will be regular `CredentialsMissing` message 

} 

myGetSecret जो उपयोगकर्ता नाम हो जाता है और अपने गुप्त (जैसे पासवर्ड) देता है, डेटाबेस से संभवतः यह हो रही है अपने कस्टम कार्य है। verifySecret सुरक्षित रूप से तुलना करेगा (समय पर हमला से बचने के लिए) myGetSecret से अपने पासवर्ड के साथ पासवर्ड प्रदान किया जाएगा। आम तौर पर, "गुप्त" कोई छिपी हुई जानकारी है (जैसे क्रेडेंशियल्स या टोकन की हैश) लेकिन मूल प्रमाणीकरण के मामले में यह केवल http हेडर से निकाला गया एक सादा पासवर्ड है।

यदि आपको अधिक अनुकूलित दृष्टिकोण की आवश्यकता है - authenticateOrRejectWithChallenge का उपयोग करें जो HttpCredentials को इनपुट के रूप में प्राप्त करता है, ताकि आप वहां से प्रदान किए गए पासवर्ड निकाल सकें।

प्राधिकरण के बारे में अधिक जानकारी in scaladocs है।

+0

इस अधिक समझ कर रहा है, लेकिन मैं लाइन समझ में नहीं आता 'अगर (p.verifySecret (myGetSecret (उपयोगकर्ता नाम))' किसी भी मौका आप एक छोटा सा रहस्य कॉल के बारे में समझा सकता है? – mattmar10

+1

@ user1551604 ' myGetSecret' आपका कस्टम फ़ंक्शन है जो 'उपयोगकर्ता नाम' प्राप्त करता है और इसे आपके पासवर्ड (उदाहरण के लिए पासवर्ड) देता है, इसे संभवतः डेटाबेस से प्राप्त करता है। 'सत्यापित करें' सुरक्षित रूप से तुलना करेगा (समय पर हमला से बचने के लिए) MyGetSecret – dk14

+0

से अपने पासवर्ड के साथ पासवर्ड प्रदान करने के लिए धन्यवाद यह थोड़ा सा मदद करता है। तो 'myGetSecret' फ़ंक्शन में पैरामीटर क्या है? मुझे लगता है कि यह सिर्फ एक स्ट्रिंग है? इसे वापस क्या करना चाहिए? मेरे पास संग्रहीत उपयोगकर्ताओं के लिए पासवर्ड है (बीसीआरपीटी का उपयोग करके हैश फॉर्म में)। यह देखते हुए कि, क्या यह अप्रशिक्षित पासवर्ड होगा? – mattmar10

संबंधित मुद्दे