Hướng dẫn này sử dụng cách tiếp cận thử nghiệm đầu tiên để triển khai xác thực dựa trên mã thông báo trong ứng dụng Flask bằng cách sử dụng Mã thông báo web JSON [JWT]
cập nhật
- 08/04/2017. Tái cấu trúc trình xử lý tuyến đường cho Thử thách PyBites
mục tiêu
Đến cuối hướng dẫn này, bạn sẽ có thể…
- Thảo luận về lợi ích của việc sử dụng JWT so với phiên và cookie để xác thực
- Triển khai xác thực người dùng với JWT
- Danh sách đen mã thông báo người dùng khi cần thiết
- Viết bài kiểm tra để tạo và xác minh JWT và xác thực người dùng
- Thực hành phát triển dựa trên thử nghiệm
Tiền thưởng miễn phí. Nhấp vào đây để truy cập vào video hướng dẫn Flask + Python miễn phí chỉ cho bạn cách xây dựng ứng dụng web Flask, từng bước một
Loại bỏ các quảng cáoGiới thiệu
Mã thông báo web JSON [hoặc JWT] cung cấp phương tiện truyền thông tin từ máy khách đến máy chủ theo cách an toàn, không trạng thái
Trên máy chủ, JWT được tạo bằng cách ký thông tin người dùng thông qua khóa bí mật, sau đó được lưu trữ an toàn trên máy khách. Hình thức xác thực này hoạt động tốt với các ứng dụng một trang hiện đại. Để biết thêm về điều này, cùng với những ưu và nhược điểm của việc sử dụng JWT so với. phiên và xác thực dựa trên cookie, vui lòng xem lại các bài viết sau
- Cookie so với mã thông báo. Hướng dẫn chi tiết
- Xác thực mã thông báo so với. Bánh quy
- Các phiên hoạt động như thế nào trong Flask?
GHI CHÚ. Hãy nhớ rằng vì JWT được ký thay vì mã hóa nên nó không bao giờ chứa thông tin nhạy cảm như mật khẩu của người dùng
Bắt đầu
Đủ lý thuyết, hãy bắt đầu thực hiện một số mã
Thiết lập dự án
Bắt đầu bằng cách nhân bản dự án soạn sẵn và sau đó tạo một nhánh mới
$ git clone //github.com/realpython/flask-jwt-auth.git
$ cd flask-jwt-auth
$ git checkout tags/1.0.0 -b jwt-auth
Tạo và kích hoạt virtualenv và cài đặt các phụ thuộc
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
Đây là tùy chọn, nhưng bạn nên tạo một kho lưu trữ Github mới và cập nhật điều khiển từ xa
[env]$ git remote set-url origin
Thiết lập cơ sở dữ liệu
Hãy thiết lập Postgres
GHI CHÚ. Nếu bạn đang dùng Mac, hãy xem ứng dụng Postgres
Khi máy chủ Postgres cục bộ đang chạy, hãy tạo hai cơ sở dữ liệu mới từ
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
6 có cùng tên với tên dự án của bạn[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
GHI CHÚ. Có thể có một số biến thể đối với các lệnh trên, để tạo cơ sở dữ liệu, dựa trên phiên bản Postgres của bạn. Kiểm tra lệnh chính xác trong tài liệu Postgres
Trước khi áp dụng di chuyển cơ sở dữ liệu, chúng tôi cần cập nhật tệp cấu hình có trong project/server/config. py. Chỉ cần cập nhật
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
7database_name = 'flask_jwt_auth'
Đặt các biến môi trường trong thiết bị đầu cuối
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
Cập nhật các bài kiểm tra sau trong project/tests/test__config. py
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
Chạy chúng để đảm bảo chúng vẫn vượt qua
[env]$ python manage.py test
Bạn nên thấy
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
0Loại bỏ các quảng cáodi cư
Thêm một mô hình. py vào thư mục “máy chủ”
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
1Trong đoạn mã trên, chúng tôi xác định mô hình người dùng cơ bản, sử dụng tiện ích mở rộng Flask-Bcrypt để băm mật khẩu
Cài đặt psycopg2 để kết nối với Postgres
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
0Trong vòng quản lý. py thay đổi-
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
1Đến-
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
2Áp dụng di chuyển
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
3Kiểm tra sự tỉnh táo
Nó có hoạt động không?
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
4Cài đặt JWT
Quy trình xác thực hoạt động như sau
- Khách hàng cung cấp email và mật khẩu, được gửi đến máy chủ
- Sau đó, máy chủ xác minh rằng email và mật khẩu là chính xác và phản hồi bằng mã thông báo xác thực
- Khách hàng lưu trữ mã thông báo và gửi nó cùng với tất cả các yêu cầu tiếp theo tới API
- Máy chủ giải mã mã thông báo và xác thực nó
Chu kỳ này lặp lại cho đến khi mã thông báo hết hạn hoặc bị thu hồi. Trong trường hợp sau, máy chủ phát hành mã thông báo mới
Bản thân các mã thông báo được chia thành ba phần
- tiêu đề
- Khối hàng
- Chữ ký
Chúng tôi sẽ tìm hiểu sâu hơn một chút về tải trọng, nhưng nếu tò mò, bạn có thể đọc thêm về từng phần từ bài viết Giới thiệu về mã thông báo web JSON
Để làm việc với Mã thông báo web JSON trong ứng dụng của chúng tôi, hãy cài đặt gói PyJWT
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
5Loại bỏ các quảng cáomã hóa mã thông báo
Thêm phương thức sau vào lớp
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
8 trong dự án/máy chủ/mô hình. py$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
6Đừng quên thêm nhập khẩu
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
7Vì vậy, được cung cấp id người dùng, phương thức này tạo và trả về mã thông báo từ tải trọng và khóa bí mật được đặt trong cấu hình. tập tin py. Tải trọng là nơi chúng tôi thêm siêu dữ liệu về mã thông báo và thông tin về người dùng. Thông tin này thường được gọi là Tuyên bố JWT. Chúng tôi sử dụng các "tuyên bố" sau đây
9. ngày hết hạn của mã thông báoclass TestDevelopmentConfig[TestCase]: def create_app[self]: app.config.from_object['project.server.config.DevelopmentConfig'] return app def test_app_is_development[self]: self.assertTrue[app.config['DEBUG'] is True] self.assertFalse[current_app is None] self.assertTrue[ app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth' ] class TestTestingConfig[TestCase]: def create_app[self]: app.config.from_object['project.server.config.TestingConfig'] return app def test_app_is_testing[self]: self.assertTrue[app.config['DEBUG']] self.assertTrue[ app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test' ]
0. thời gian mã thông báo được tạo[env]$ python manage.py test
1. chủ đề của mã thông báo [người dùng mà nó xác định][env]$ python manage.py test
Khóa bí mật phải là ngẫu nhiên và chỉ phía máy chủ mới có thể truy cập được. Sử dụng trình thông dịch Python để tạo khóa
>>>
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
8Đặt khóa làm biến môi trường
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
9Thêm khóa này vào
[env]$ python manage.py test
2 trong lớp [env]$ python manage.py test
3 trong project/server/config. py[env]$ git remote set-url origin
0Cập nhật các bài kiểm tra trong project/tests/test__config. py để đảm bảo biến được đặt chính xác
[env]$ git remote set-url origin
1Trước khi tiếp tục, hãy viết một bài kiểm tra đơn vị nhanh cho mô hình người dùng. Thêm mã sau vào tệp mới có tên test_user_model. py trong “dự án/thử nghiệm”
[env]$ git remote set-url origin
2Chạy thử nghiệm. Tất cả họ nên vượt qua
Mã thông báo giải mã
Tương tự, để giải mã mã thông báo, hãy thêm phương thức sau vào lớp
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
8[env]$ git remote set-url origin
3Chúng tôi cần giải mã mã thông báo xác thực với mọi yêu cầu API và xác minh chữ ký của nó để chắc chắn về tính xác thực của người dùng. Để xác minh
[env]$ python manage.py test
5, chúng tôi đã sử dụng cùng một [env]$ python manage.py test
2 được sử dụng để mã hóa mã thông báoNếu
[env]$ python manage.py test
5 hợp lệ, chúng tôi sẽ lấy id người dùng từ chỉ mục [env]$ python manage.py test
1 của tải trọng. Nếu không hợp lệ, có thể có hai trường hợp ngoại lệ- Chữ ký đã hết hạn. Khi mã thông báo được sử dụng sau khi hết hạn, nó sẽ đưa ra một ngoại lệ
9. Điều này có nghĩa là thời gian được chỉ định trong trường[env]$ python manage.py test
9 của tải trọng đã hết hạnclass TestDevelopmentConfig[TestCase]: def create_app[self]: app.config.from_object['project.server.config.DevelopmentConfig'] return app def test_app_is_development[self]: self.assertTrue[app.config['DEBUG'] is True] self.assertFalse[current_app is None] self.assertTrue[ app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth' ] class TestTestingConfig[TestCase]: def create_app[self]: app.config.from_object['project.server.config.TestingConfig'] return app def test_app_is_testing[self]: self.assertTrue[app.config['DEBUG']] self.assertTrue[ app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test' ]
- Mã không hợp lệ. Khi mã thông báo được cung cấp không chính xác hoặc không đúng định dạng, thì một ngoại lệ
01 sẽ xuất hiện$ python3.6 -m venv env $ source env/bin/activate [env]$ pip install -r requirements.txt
GHI CHÚ. Chúng tôi đã sử dụng một phương thức tĩnh vì nó không liên quan đến thể hiện của lớp
Thêm một bài kiểm tra vào test_user_model. py
[env]$ git remote set-url origin
4Đảm bảo vượt qua các bài kiểm tra trước khi tiếp tục
Loại bỏ các quảng cáoGHI CHÚ. Chúng tôi sẽ xử lý các mã thông báo không hợp lệ bằng cách đưa chúng vào danh sách đen sau
Thiết lập tuyến đường
Bây giờ chúng ta có thể định cấu hình các tuyến xác thực bằng cách sử dụng phương pháp thử nghiệm đầu tiên
02$ python3.6 -m venv env $ source env/bin/activate [env]$ pip install -r requirements.txt
03$ python3.6 -m venv env $ source env/bin/activate [env]$ pip install -r requirements.txt
04$ python3.6 -m venv env $ source env/bin/activate [env]$ pip install -r requirements.txt
05$ python3.6 -m venv env $ source env/bin/activate [env]$ pip install -r requirements.txt
Bắt đầu bằng cách tạo một thư mục mới có tên là “auth” trong “project/server”. Sau đó, trong “auth” thêm hai tệp, __init__. py và lượt xem. py. Cuối cùng, thêm đoạn mã sau vào chế độ xem. py
[env]$ git remote set-url origin
5Để đăng ký Bản thiết kế mới với ứng dụng, hãy thêm phần sau vào cuối dự án/máy chủ/__init__. py
[env]$ git remote set-url origin
6Bây giờ, thêm một tệp mới có tên test_auth. py trong “project/tests” để giữ tất cả các thử nghiệm của chúng tôi cho Bản thiết kế này
[env]$ git remote set-url origin
7Đăng ký lộ trình
Bắt đầu với một bài kiểm tra
[env]$ git remote set-url origin
8Đảm bảo thêm phần nhập
[env]$ git remote set-url origin
9Chạy thử nghiệm. Bạn sẽ thấy lỗi sau
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
0Bây giờ, hãy viết mã để vượt qua bài kiểm tra. Thêm phần sau vào dự án/máy chủ/auth/lượt xem. py
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
1Tại đây, chúng tôi đăng ký người dùng mới và tạo mã thông báo xác thực mới cho các yêu cầu tiếp theo mà chúng tôi gửi lại cho khách hàng
Chạy các bài kiểm tra để đảm bảo tất cả chúng đều vượt qua
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
2Tiếp theo, hãy thêm một lần kiểm tra nữa để đảm bảo đăng ký không thành công nếu người dùng đã tồn tại
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
3Chạy lại các bài kiểm tra trước khi chuyển sang lộ trình tiếp theo. Tất cả nên vượt qua
Loại bỏ các quảng cáoLộ trình đăng nhập
Một lần nữa, bắt đầu với một bài kiểm tra. Để xác minh API đăng nhập, hãy kiểm tra hai trường hợp
- Người dùng đã đăng ký đăng nhập
- Đăng nhập người dùng chưa đăng ký
Người dùng đã đăng ký đăng nhập
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
4Trong trường hợp thử nghiệm này, người dùng đã đăng ký cố gắng đăng nhập và như mong đợi, ứng dụng của chúng tôi sẽ cho phép điều này
Chạy thử nghiệm. Họ nên thất bại. Bây giờ hãy viết mã
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
5Đừng quên chuyển đổi lớp thành chức năng xem
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
6Chạy lại các bài kiểm tra. Họ có vượt qua không? . Đừng tiếp tục cho đến khi tất cả các bài kiểm tra vượt qua
Người dùng chưa đăng ký đăng nhập
thêm bài kiểm tra
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
7Trong trường hợp này, một người dùng chưa đăng ký cố gắng đăng nhập và như mong đợi, ứng dụng của chúng ta sẽ không cho phép điều này
Chạy thử nghiệm, sau đó cập nhật mã
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
8Chúng ta đã thay đổi những gì?
Tuyến trạng thái người dùng
Để có được thông tin chi tiết về người dùng hiện đang đăng nhập, mã thông báo xác thực phải được gửi cùng với yêu cầu trong tiêu đề
Bắt đầu với một bài kiểm tra
[env]$ psql
# create database flask_jwt_auth;
CREATE DATABASE
# create database flask_jwt_auth_test;
CREATE DATABASE
# \q
9bài kiểm tra sẽ thất bại. Bây giờ, trong lớp xử lý, chúng ta nên
- trích xuất mã thông báo xác thực và kiểm tra tính hợp lệ của nó
- lấy id người dùng từ tải trọng và nhận thông tin chi tiết về người dùng [tất nhiên nếu mã thông báo hợp lệ]
database_name = 'flask_jwt_auth'
0Vì vậy, nếu mã thông báo hợp lệ và chưa hết hạn, chúng tôi sẽ lấy id người dùng từ tải trọng của mã thông báo, sau đó được sử dụng để lấy dữ liệu người dùng từ cơ sở dữ liệu
GHI CHÚ. Chúng tôi vẫn cần kiểm tra xem mã thông báo có nằm trong danh sách đen không. Chúng tôi sẽ nhận được điều này trong thời gian ngắn
Đảm bảo thêm
database_name = 'flask_jwt_auth'
1Và
database_name = 'flask_jwt_auth'
2Các bài kiểm tra nên vượt qua
database_name = 'flask_jwt_auth'
3Một con đường nữa để đi
Loại bỏ các quảng cáoKiểm tra lộ trình đăng xuất
Kiểm tra đăng xuất hợp lệ
database_name = 'flask_jwt_auth'
4Trong thử nghiệm đầu tiên này, chúng tôi đăng ký người dùng mới, đăng nhập họ, sau đó cố gắng đăng xuất họ trước khi mã thông báo hết hạn
Kiểm tra đăng xuất không hợp lệ
database_name = 'flask_jwt_auth'
5Giống như lần kiểm tra trước, chúng tôi đăng ký người dùng, đăng nhập và sau đó cố gắng đăng xuất họ. Trong trường hợp này, mã thông báo không hợp lệ vì đã hết hạn
Thêm nhập khẩu
database_name = 'flask_jwt_auth'
6Bây giờ, mã phải
- xác thực mã thông báo xác thực
- liệt kê mã thông báo vào danh sách đen [tất nhiên là nếu hợp lệ]
Trước khi viết trình xử lý định tuyến, hãy tạo một mô hình mới cho các mã thông báo trong danh sách đen…
Danh sách đen
Thêm mã sau vào dự án/máy chủ/mô hình. py
database_name = 'flask_jwt_auth'
7Sau đó tạo và áp dụng di chuyển. Sau khi hoàn thành, cơ sở dữ liệu của bạn sẽ có các bảng sau
database_name = 'flask_jwt_auth'
8Cùng với đó, chúng ta có thể thêm trình xử lý đăng xuất…
Trình xử lý tuyến đường đăng xuất
Cập nhật lượt xem
database_name = 'flask_jwt_auth'
9Cập nhật hàng nhập
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
0Khi người dùng đăng xuất, mã thông báo không còn hiệu lực nên chúng tôi thêm nó vào danh sách đen
GHI CHÚ. Thông thường, các ứng dụng lớn hơn thỉnh thoảng có cách gia hạn mã thông báo trong danh sách đen để hệ thống không hết mã thông báo hợp lệ
Chạy thử nghiệm
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
1Loại bỏ các quảng cáotái cấu trúc
Cuối cùng, chúng tôi cần đảm bảo rằng mã thông báo không bị đưa vào danh sách đen, ngay sau khi mã thông báo được giải mã -
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
06 - trong các tuyến trạng thái đăng xuất và người dùngĐầu tiên, hãy viết một bài kiểm tra cho lộ trình đăng xuất
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
2Trong thử nghiệm này, chúng tôi đưa mã thông báo vào danh sách cấm ngay trước khi lộ trình đăng xuất bị tấn công, điều này khiến mã thông báo hợp lệ của chúng tôi không sử dụng được
Cập nhật hàng nhập
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
0Thử nghiệm sẽ thất bại với ngoại lệ sau
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
4Bây giờ hãy cập nhật chức năng
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
07 để xử lý các mã thông báo đã được đưa vào danh sách đen ngay sau khi giải mã và phản hồi bằng thông báo thích hợp[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
5Cuối cùng, thêm hàm
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
08 vào project/server/models. py trong lớp $ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
09[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
6Trước khi bạn chạy thử nghiệm, hãy cập nhật
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
10 để chuyển đổi đối tượng byte thành chuỗi[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
7Chạy thử nghiệm
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
8Theo cách tương tự, thêm một bài kiểm tra nữa cho lộ trình trạng thái người dùng
[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
9Tương tự như lần kiểm tra trước, chúng tôi đã đưa mã thông báo vào danh sách đen trước khi tuyến trạng thái người dùng bị tấn công
Chạy thử nghiệm lần cuối
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
0Loại bỏ các quảng cáoMã Mùi
Cuối cùng, hãy xem test_auth. py. Chú ý mã trùng lặp?
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
1Có tám lần xuất hiện của điều này. Để khắc phục, hãy thêm trình trợ giúp sau vào đầu tệp
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
2Bây giờ, bất cứ nơi nào bạn cần đăng ký người dùng, bạn có thể gọi người trợ giúp
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
3Làm thế nào về việc đăng nhập một người dùng? . Bạn có thể cấu trúc lại những gì khác?
Cấu trúc lại
Đối với Thử thách PyBites, hãy cấu trúc lại một số mã để khắc phục sự cố được thêm vào repo GitHub. Bắt đầu bằng cách thêm bài kiểm tra sau vào test_auth. py
class TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
4Về cơ bản, sẽ xảy ra lỗi nếu tiêu đề
$ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
11 được định dạng không chính xác - e. g. , không có khoảng cách giữa $ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
12 và giá trị mã thông báo. Chạy thử nghiệm để đảm bảo chúng không thành công, sau đó cập nhật lớp $ python3.6 -m venv env
$ source env/bin/activate
[env]$ pip install -r requirements.txt
13 trong project/server/auth/views. pyclass TestDevelopmentConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.DevelopmentConfig']
return app
def test_app_is_development[self]:
self.assertTrue[app.config['DEBUG'] is True]
self.assertFalse[current_app is None]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth'
]
class TestTestingConfig[TestCase]:
def create_app[self]:
app.config.from_object['project.server.config.TestingConfig']
return app
def test_app_is_testing[self]:
self.assertTrue[app.config['DEBUG']]
self.assertTrue[
app.config['SQLALCHEMY_DATABASE_URI'] == 'postgresql://postgres:@localhost/flask_jwt_auth_test'
]
5Chạy thử nghiệm lần cuối
Phần kết luận
Trong hướng dẫn này, chúng ta đã trải qua quá trình thêm xác thực vào ứng dụng Flask bằng JSON Web Tokens. Quay lại các mục tiêu từ phần đầu của hướng dẫn này. Bạn có thể đưa từng người vào hành động?
Cái gì tiếp theo? . Kiểm tra Xác thực dựa trên mã thông báo với góc để thêm góc vào hỗn hợp
Để xem cách xây dựng một ứng dụng web hoàn chỉnh từ đầu bằng Flask, hãy xem loạt video của chúng tôi
Tiền thưởng miễn phí. Nhấp vào đây để truy cập vào video hướng dẫn Flask + Python miễn phí chỉ cho bạn cách xây dựng ứng dụng web Flask, từng bước một
Vui lòng chia sẻ nhận xét, câu hỏi hoặc mẹo của bạn trong các nhận xét bên dưới. Mã đầy đủ có thể được tìm thấy trong kho lưu trữ jar-jwt-auth
Chúc mừng
Đánh dấu là đã hoàn thành
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi