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'

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ết

Chú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 $_
$ npm init -y
$ npm i -S express body-parser mongoose mongoose-paginate kerberos cors morgan bcryptjs moment jwt-simple

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
├── controllers
│ ├── auth.js
│ └── people.js
├── models
│ └── person.js
├── app.js
├── config.js
├── package.json
└── routes.js

/ứ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. js

cấ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. js

Cá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. js

Mô 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. js

Bộ đ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
...waiting for connections on port 27017

Sau đó, bắt đầu Node của chúng tôi. ứng dụng js

$ node app.js
listening on port 3000

Đó 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ôi

Hã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
Họ. thợ rèn
E-mail. jsmith@ví dụ. com
Mật khẩu. MyP@ssword

Đầ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ập

John 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
├── controllers
│ ├── auth.js
│ └── people.js
├── models
│ └── person.js
├── app.js
├── config.js
├── package.json
└── routes.js
0

Sự 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 đề