2015-10-18 26 views
12

Tìm kiếm giải thích tốt về cách thực hiện xác thực bằng cách sử dụng akka HTTP. Với một con đường mà trông giống nhưCách xác thực bằng cách sử dụng Akka HTTP

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

The documentation vạch ra một con đường, nhưng sau đó phần liên hệ thực hiện thẩm định thực tế được bỏ qua ...

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

Tôi có thể tìm thấy một thực hiện ví dụ về xác thực như vậy đâu ? Tôi đã có logic để xác thực một người dùng được cung cấp một tên người dùng và mật khẩu, nhưng những gì tôi không thể tìm ra là làm thế nào để có được một tên người dùng/mật khẩu (hoặc mã thông báo có chứa cả hai) từ yêu cầu HTTP (hoặc RequestContext).

Trả lời

8

Authenticator chỉ là một chức năng UserCredentials => Option[T], nơi UserCredentials trong trường hợp bị (kiểm tra với mô hình kết hợp) ProvidedverifySecret(secret) phương pháp mà bạn cần phải gọi một cách an toàn và trở về Some (Một số người sử dụng ví dụ) trong trường hợp thành công, như:

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 

} 

là chức năng tùy chỉnh nhận tên người dùng và trả về bí mật của bạn (ví dụ: mật khẩu), nhận dữ liệu từ cơ sở dữ liệu. verifySecret sẽ so sánh an toàn (để tránh bị tấn công theo thời gian) cung cấp mật khẩu với mật khẩu của bạn từ myGetSecret. Nói chung, "bí mật" là bất kỳ thông tin ẩn nào (như băm thông tin xác thực hoặc mã thông báo) nhưng trong trường hợp xác thực cơ bản, nó chỉ là một mật khẩu thuần túy được trích xuất từ ​​tiêu đề http.

Nếu bạn cần cách tiếp cận tùy chỉnh hơn - hãy sử dụng authenticateOrRejectWithChallenge để nhập HttpCredentials làm đầu vào, do đó bạn có thể trích xuất mật khẩu được cung cấp từ đó.

Thông tin thêm về ủy quyền là in scaladocs.

+0

này là làm cho ý nghĩa hơn, nhưng tôi không hiểu dòng 'nếu (p.verifySecret (myGetSecret (username))' Bất kỳ cơ hội bạn có thể giải thích một chút về các cuộc gọi bí mật? – mattmar10

+1

@ user1551604 ' myGetSecret' là chức năng tùy chỉnh của bạn nhận 'username' và trả về bí mật của bạn (vd: password), lấy nó từ database.' verifySecret' sẽ so sánh an toàn (để tránh tấn công thời gian) cung cấp mật khẩu với mật khẩu của bạn từ myGetSecret – dk14

+0

cảm ơn bạn đã thêm Nó có ích gì một chút, vì vậy tham số trong hàm 'myGetSecret' là gì? Tôi đoán nó chỉ là một chuỗi? Nó sẽ trả về cái gì? Tôi có mật khẩu cho người dùng được lưu trữ (dạng băm sử dụng BCrypt). nó có phải là mật khẩu chưa được rửa không? – mattmar10

Các vấn đề liên quan