Nút xác thực JWT js MongoDB
API thật tuyệt vời. Nếu bạn đang viết một ứng dụng mà một ngày nào đó có thể cần tích hợp với một ứng dụng khác hoặc bạn chỉ cần phần phụ trợ của riêng mình cho AngularJS, di động hoặc các API tương tự là cách. Nếu bạn cần thuyết phục hơn, hãy xem bài viết của Brian Proffitt 'API là gì và tại sao chúng lại quan trọng' Show JWT thật tuyệt vời. Họ bảo vệ API của bạn bằng cách chuyển chữ ký mật mã với mọi yêu cầu. Chỉ ứng dụng của bạn mới có thể xác thực JWT, sau đó ứng dụng sẽ sử dụng để nhận dạng duy nhất một người. Để tìm hiểu sâu hơn về giao thức, hãy xem 'The Anatomy of a JSON Web Token' của Chris Sevilleja. Hoặc, truy cập trang web chính thức của JWT Nút. js là một lựa chọn. Tôi đã chọn Nút. js ở đây, nếu đây không phải là sở thích của bạn, đừng lo lắng, bạn có thể áp dụng các nguyên tắc cho bất kỳ ngôn ngữ nào MongoDB là một lựa chọn. MongoDB rất phù hợp với Node. js. Tuy nhiên, bất kỳ cơ sở dữ liệu sẽ làm Hãy xây dựng nó Ứng dụng ví dụ của chúng tôi sẽ bao gồm một bộ sưu tập Mọi người, được lưu trữ trong MongoDB. API sẽ cho phép mọi người xác thực (đăng nhập) hoặc đăng ký tài khoản mới (đăng ký). Sau khi đăng ký, mọi người sẽ nhận được các JWT duy nhất mà họ có thể sử dụng để truy cập các khu vực được bảo vệ của API; Mát mẻ, phải không? điều kiện tiên quyếtChúng tôi sẽ sử dụng một số gói cho Node. js. Tôi sẽ không trình bày chi tiết về chúng ở đây. Nếu bạn muốn tìm hiểu thêm về bất kỳ gói nào, hãy truy cập https. //www. npmjs. com. Tôi cũng cho rằng bạn có Node. js đã được cài đặt và sẵn sàng sử dụng. Nếu không, hãy xem http. //nodejs. org để được giúp đỡ. Đối với cơ sở dữ liệu MongoDB, có thể tìm thấy trợ giúp tại https. //www. mongodb. tổ chức/ Chuẩn bị nút. ứng dụng js$ mkdir api-jwt && cd $_ Ghi chú. Đến cuối hướng dẫn này, cấu trúc tệp ứng dụng của bạn sẽ là api-jwt /ứng dụng. jsứng dụng. js là điểm vào của ứng dụng của chúng tôi. Nó tải tất cả các mô-đun, tuyến đường và cấu hình cần thiết; Một số từ về bảo mậtĐiều quan trọng là phải xem điểm số 4 trong ứng dụng. mã js. Khi sử dụng JWT để xác thực ứng dụng khách của mình, chúng tôi phải luôn chạy các dịch vụ sản xuất của mình qua giao thức HTTPS (SSL/TLS) an toàn. Khi JWT được cấp cho một người, nó có thể được sử dụng để xác thực họ cho mỗi yêu cầu tiếp theo đối với API của chúng tôi. Do đó, nếu một người dùng ác ý đánh cắp JWT của người khác (ví dụ: bằng cách đánh hơi lưu lượng truy cập http không được mã hóa) thì họ sẽ có thể giả dạng họ Nếu điều tồi tệ nhất xảy ra và mã thông báo bị đánh cắp, API của chúng tôi sẽ thực hiện một biện pháp để ngăn việc tiếp tục sử dụng mã thông báo đó. Mỗi JWT chỉ có giá trị trong một khoảng thời gian nhất định (thời gian hết hạn). Khi thời gian trôi qua, JWT sẽ hết hạn và chủ sở hữu phải xác thực lại để được cấp một cái mới Ngoài ra, tất cả JWT đều được ký bằng khóa bí mật mà chỉ ứng dụng của bạn biết. Là quản trị viên, bạn có thể ngay lập tức vô hiệu hóa tất cả JWT bằng cách thay đổi khóa bí mật của ứng dụng của mình. Điều này sẽ yêu cầu tất cả người dùng xác thực lại cho JWT mới /config. jscấu hình. js chứa một số cấu hình cơ bản cho ứng dụng của chúng tôi - chúng tôi sẽ kết nối với máy chủ MongoDB cục bộ và API của chúng tôi sẽ lắng nghe trên http. //máy chủ cục bộ. 3000 TOKEN_SECRET là nơi chúng tôi đặt khóa bí mật cho JWT của mình. Đây phải là một chuỗi dài, phức tạp. Để tạo bí mật duy nhất của bạn, tôi thực sự khuyên bạn nên sử dụng trang 'Mật khẩu hoàn hảo' của Steve Gibson vĩ đại / tuyến đường. jsCác tuyến xác thực của chúng tôi (điểm 4) xử lý các yêu cầu đăng ký và đăng nhập mới. Khi người dùng đăng ký hoặc đăng nhập thành công, họ sẽ được cấp JWT cho các yêu cầu tiếp theo đối với các khu vực được bảo vệ Các tuyến ứng dụng (điểm 5) là các khu vực được bảo vệ. Chức năng phần mềm trung gian 'ensureAuthenticated' (điểm 2) được sử dụng để xác thực JWT được chuyển đến các khu vực được bảo vệ. Nếu một người cố gắng truy cập vào các khu vực được bảo vệ mà không có JWT hoặc JWT không hợp lệ hoặc JWT đã hết hạn; /người mẫu/người. jsMô hình cầy mangut của Người chúng ta. Một người phải có tên, địa chỉ email và mật khẩu (điểm 2). Mật khẩu được chuyển đổi thành hàm băm được mã hóa bằng bcrypt (điểm 4) trước khi được lưu trữ vào cơ sở dữ liệu. Khi đăng nhập, mật khẩu của người đó được so sánh an toàn với hàm băm cơ sở dữ liệu (điểm 5) /bộ điều khiển/người. jsBộ điều khiển người phản hồi các tuyến đường được bảo vệ của chúng tôi, với dữ liệu từ cơ sở dữ liệu. Trong ví dụ của chúng tôi, chúng tôi có thể tìm nạp danh sách mọi người, một cá nhân hoặc hồ sơ cá nhân của một người Khởi động máy chủ APIĐảm bảo mongod đang chạy $ mongod Sau đó, bắt đầu Node của chúng tôi. ứng dụng js $ node app.js Đó là nó. Tất cả những gì còn lại phải làm bây giờ là sử dụng API của chúng tôi để thúc đẩy… Lái thử API của chúng tôiHãy kiểm tra các chức năng của API của chúng tôi Đăng kýĐể kiểm tra quy trình đăng ký của chúng tôi, chúng tôi sẽ tạo người sau Tên đầu tiên. John Đầu tiên, chúng tôi mô hình hóa người đó như một đối tượng JSON {"first": "John", "last": "Smith", "email": "[email protected]", "password": "MyP@ssword"} Bây giờ, chúng tôi POST JSON vào tuyến đường /auth/signup của chúng tôi $ curl -X POST -H 'Content-Type: application/json' -d '{"first": "John", "last": "Smith", "email": "[email protected]", "password": "MyP@ssword"}' http://localhost:3000/auth/signup Người dùng đã đăng ký và API của chúng tôi trả lời bằng JWT, được lưu trữ trong trường JSON 'mã thông báo' {“token”:”eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1NmE2MDVhOGRjZmRiMDZmMDA0ODg1MmYiLCJpYXQiOjE0NTM3MjEwMDEsImV4cCI6MTQ1NDkzMDYwMX0.2pCI0DnTnc0HyQJSxqJL6LHZBLtbCtaMhAujIjUUkHY”} Mã thông báo này hiện có thể được sử dụng để truy cập các khu vực được bảo vệ trong API của chúng tôi Nếu chúng tôi cố gắng đăng ký lại 'John Smith', API của chúng tôi sẽ không cho phép chúng tôi tạo anh ấy - email của anh ấy đã tồn tại $ curl -X POST -H 'Content-Type: application/json' -d '{"first": "John", "last": "Smith", "email": "[email protected]", "password": "MyP@ssword"}' http://localhost:3000/auth/signup{"error": "EmailExists"} Hoan hô, đăng ký đang hoạt động bình thường Đăng nhậpJohn Smith hiện đã có tài khoản, anh ấy có thể chuyển email và mật khẩu của mình tới API của chúng tôi để nhận JWT mới ________số 8_______Sự thành công. JWT mới được cấp mỗi khi John đăng nhập Truy cập các tuyến đường được bảo vệĐể truy cập các khu vực được bảo vệ của API của chúng tôi, chúng tôi cần chuyển JWT của John vào tiêu đề của mỗi yêu cầu. Tiêu đề 'Ủy quyền' được sử dụng cho việc này, với mã thông báo được chuyển bằng tiền tố 'Bearer'. Ví dụ Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1NmE2MDVhOGRjZmRiMDZmMDA0ODg1MmYiLCJpYXQiOjE0NTM3MjE3ODcsImV4cCI6MTQ1NDkzMTM4N30.sJj3f3agKhXlXy3Myaxy7QqqeL9tKMGFs160OgkJqaw Để kiểm tra lý thuyết này, chúng tôi sẽ cố gắng tìm nạp tuyến đường được bảo vệ, ‘/people’, tuyến đường này sẽ trả về một mảng JSON gồm các đối tượng người dùng api-jwt 0Sự thành công. Chúng tôi nhận được một danh sách những người Bây giờ, hãy xem điều gì sẽ xảy ra khi chúng ta cố gắng truy cập một tuyến đường được bảo vệ mà không chuyển JWT trong tiêu đề |