2015-06-25 13 views
7

ContextMicroservices xác thực

Tôi có nhiều dịch vụ như:

  • tài khoản (LDAP hoặc thư mục hoạt động vv ...)
  • Thanh toán
  • Kế hoạch
  • vv ...
  • Xác thực

tôi cần phải kết nối trên microservices tôi Sử dụng OAuth2.0, cho đầu, sử dụng tên đăng nhập chuẩn/mật khẩu (tôi sử dụng dữ liệu của riêng tôi, và không gettint một máy chủ chân thứ ba)

Vấn đề

Theo những bức ảnh này:

Bước 1

enter image description here

Bước 2

enter image description here

Làm thế nào tôi có thể xử lý kiểm soát access_token hoặc kiểm soát quyền truy cập, các dịch vụ khác của tôi hơn authmicroservice?

Trả lời

1

có một hướng dẫn và mô tả dòng chảy xác thực trong microservices trong activator của chúng tôi, đó là trong Scala - http://www.typesafe.com/activator/template/reactive-microservices (nguồn: https://github.com/theiterators/reactive-microservices)


Ý tưởng cơ bản là: Bạn cần phải xác nhận tính xác thực của thẻ auth cho mọi yêu cầu. Bạn có thể:

- làm điều đó trong một proxy (gateway)

- làm điều đó bên trong microservice thanh toán


Những gì chúng ta có xu hướng làm là: để xác nhận Auth-Mã bên trong mọi dịch vụ nhỏ của khách hàng.

- Chúng tôi giữ thông tin Auth-Token to User trong phiên bản Redis.

- Dịch vụ khách hàng phải đối mặt với yêu cầu thẩm redis nếu dấu hiệu này là hợp lệ

- Redis trả về một số chuỗi JSON rằng chúng ta có thể sử dụng như là một dữ liệu người dùng cho phép tiếp tục.

Vì vậy, dòng chảy phía máy chủ trông như thế này

get("projects/"/Segment) { projectName => 
    getHeader("Auth-Token") { authToken => 
    Redis.get("auth:token:#{authToken}").map { userJson => 
     if(userJson("projects").include(projectName)) { 
     ...processSth... 
     Ok 
     } else { 
     Unauthorized 
     } 
    } 
    } 
} 
+0

Cảm ơn câu trả lời của bạn. Một phần của bài đăng mà tôi thực sự quan tâm là bài viết thứ hai, khi bạn nói "Bạn có thể làm điều đó trong Cổng hoặc trong mỗi dịch vụ". Bạn có thể chi tiết hơn một chút với quảng cáo và khuyết điểm không? : - D – mfrachet

+1

=> Hãy tách ủy quyền khỏi xác thực. Dịch vụ xác thực cung cấp cho "lối vào" "người dùng" một phương tiện để nói "vâng, đó là tôi, đó là phiên của tôi". Việc cho phép người dùng X có thể làm điều gì đó hoặc không thể. Mặc dù xác thực được thực hiện bằng dịch vụ xác thực/oauth, v.v., ủy quyền có thể được kết nối với nhiều quy tắc kinh doanh sâu hơn và phức tạp hơn. Giả sử kiểm tra cổng nếu auth-token hợp lệ và gọi các dịch vụ được bao bọc bằng tiêu đề HTTP X-UserId. Bây giờ các dịch vụ đó cần tự kiểm tra xem người dùng có id đã cho có thể làm điều gì đó không. Ví dụ Nếu UserId == project.ownerId project.save() –

+0

Vì vậy, proxy có thể là NGINX có một số kịch bản truy cập Redis và kiểm tra xem mã thông báo có nằm trong dấu đỏ hay không và chuyển giá trị của mã thông báo từ Redis trong tiêu đề tới các dịch vụ được bao bọc. Hoặc nó có thể là một microservice thông thường. Điều này có thể được xếp lớp theo yêu cầu, với đủ miền phức tạp. –

0

Có thể tạo ra dịch vụ Auth riêng biệt để cung cấp access_token như bạn thấy ở bước 1. Nhưng trong API Gateway mỗi dịch vụ sẽ cần thiết để gọi đó là dịch vụ auth để xác thực mã thông báo.Cách tốt nhất để áp dụng quy trình oauth trong API Gateway mà tôi đang sử dụng cũng như cho sản phẩm của tôi và cách tiếp cận này cũng được giải thích trong nhiều bài viết. cho phép xem hình ảnh bên dưới.

inlined image

Trong góc độ kỹ thuật, Nó có thể đơn giản là một phần của mã (chức năng) mà xử lý tiêu đề yêu cầu để xác minh dấu hiệu cung cấp như xác thực oauth, mà có thể xử lý trong mã hoặc bằng cách truy cập cơ sở dữ liệu riêng trước khi nó chuyển tiếp yêu cầu đến điểm cuối của dịch vụ.

Bạn có thể thực hiện theo một phương pháp để cung cấp xác thực, bảo mật và gửi yêu cầu đến điểm cuối bằng dịch vụ Cổng API nâng cao. Có câu hỏi đã được hỏi tại stackoverflow here, Nhưng những gì tôi thấy dễ làm theo là 3 hoặc 4 loạt hướng dẫn bạn sẽ tìm thấy here

Xem hình ảnh rõ ràng về cách sử dụng API Gateway của bạn trước khi tập trung vào các dịch vụ nhỏ.

0

Tùy thuộc vào cách bạn đang cấu trúc các dịch vụ vi mô của mình, bạn cũng có thể tận dụng lợi thế của bố cục.

Vì bạn đã có dịch vụ xác thực, bạn có thể sử dụng dịch vụ này trong dịch vụ Thanh toán để kiểm tra tính xác thực của yêu cầu trước khi xử lý yêu cầu đó.

Ví dụ, nếu bạn đang sử dụng một nền tảng như StdLib (chúng tôi sử dụng này trong nhà):

// Billing 
const lib = require('lib'); 

module.exports = function(params, callback) { 
    lib.user.isAuthenticated(params, function(err, user) { 
    if (err) return callback(err); 
    // Do stuff with user, process billing 
    }); 
}; 

Điều này có thể không phải là một ý tưởng tuyệt vời dành cho bạn nếu bạn luôn sử dụng HTTP để giao tiếp giữa các chức năng (vì điều này sẽ thêm có thể là một 200-300ms tốt cho yêu cầu của bạn). Nhưng StdLib tải lên một vài dịch vụ trong cùng một khu vực và bạn có thể truy cập chúng về cơ bản giống như các hàm giải quyết cho vấn đề đó (ít nhất, cho đến nay chúng ta đã thấy).

4

Để quản lý xác thực trong kiến ​​trúc microservices, bạn phải có một quan điểm khác.

Hãy nhớ rằng khi bạn làm việc trên một khối nguyên khối, bạn đã có một quy trình xác thực duy nhất.

Ví dụ trong ứng dụng PHP, bạn tìm người dùng của mình trong cơ sở dữ liệu với thông tin đăng nhập tương ứng, sau đó bạn đã tạo phiên mà người dùng được "xác thực".

Với microservices, quy trình làm việc cũng giống nhau. Điều duy nhất thay đổi ngay bây giờ là bạn không thể mở một phiên trong các dịch vụ khác nhau. Hơn nữa, bạn không cần phải có được người dùng được xác thực. Bạn chỉ cần chắc chắn rằng anh ta được phép thực hiện cuộc gọi hiện tại trên các dịch vụ nhỏ của bạn.

Nhờ oauth2, có access_token hợp lệ cung cấp cho bạn thông tin này.

Điều này sẽ trả lời phần giao diện người dùng. Trong phần phụ trợ (ý tôi là phía sau cổng api), bạn không nên quản lý access_token vì nó không liên quan đến microservices. Bạn có thể sử dụng một phím chức năng để tìm bất kỳ thông tin nào liên quan đến người dùng bên trong các dịch vụ nhỏ như một uuid chẳng hạn.

Để nhận được uuid trong khi sử dụng oauth2, tôi cũng khuyên bạn nên sử dụng kết nối openid. Người dùng có giao thức này để quản lý thông tin người dùng cụ thể và nó cung cấp cho bạn quyền truy cập vào một điểm cuối cụ thể "/ userinfo".

Hy vọng giản đồ này sẽ làm cho câu trả lời này rõ ràng hơn.

enter image description here

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