Mã thông báo jwt python

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ể…

  1. 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
  2. Triển khai xác thực người dùng với JWT
  3. Danh sách đen mã thông báo người dùng khi cần thiết
  4. Viết bài kiểm tra để tạo và xác minh JWT và xác thực người dùng
  5. 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áo

Giớ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

  1. Cookie so với mã thông báo. Hướng dẫn chi tiết
  2. Xác thực mã thông báo so với. Bánh quy
  3. 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'
        ]
7

database_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
0

Loại bỏ các quảng cáo

di 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
1

Trong đ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
0

Trong 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
3

Kiể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
4

Cà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
5

Loại bỏ các quảng cáo

mã 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
7

Vì 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

  • 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'
            ]
    
    9. ngày hết hạn của mã thông báo
  • [env]$ python manage.py 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]

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
9

Thê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 
0

Cậ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 
1

Trướ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 
2

Chạ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 
3

Chú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áo

Nế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ệ

  1. 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ệ
    [env]$ python manage.py test
    
    9. Điều này có nghĩa là thời gian được chỉ định trong trường
    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'
            ]
    
    9 của tải trọng đã hết hạn
  2. 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ệ
    $ python3.6 -m venv env
    $ source env/bin/activate
    [env]$ pip install -r requirements.txt
    
    01 sẽ xuất hiện

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

GHI 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

Loại bỏ các quảng cáo

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

  • $ python3.6 -m venv env
    $ source env/bin/activate
    [env]$ pip install -r requirements.txt
    
    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

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 
6

Bâ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 
9

Chạ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
0

Bâ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
1

Tạ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
2

Tiế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
3

Chạ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áo

Lộ 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

  1. Người dùng đã đăng ký đăng nhập
  2. Đă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
4

Trong 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
6

Chạ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
7

Trong 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
8

Chú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
9

bà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'
0

Vì 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'
1

database_name = 'flask_jwt_auth'
2

Các bài kiểm tra nên vượt qua

database_name = 'flask_jwt_auth'
3

Một con đường nữa để đi

Loại bỏ các quảng cáo

Kiểm tra lộ trình đăng xuất

Kiểm tra đăng xuất hợp lệ

database_name = 'flask_jwt_auth'
4

Trong 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'
5

Giố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'
6

Bây giờ, mã phải

  1. xác thực mã thông báo xác thực
  2. 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'
7

Sau đó 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'
8

Cù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'
9

Cập nhật hàng nhập

[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
0

Khi 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"
1

Loại bỏ các quảng cáo

tá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"
2

Trong 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"
0

Thử nghiệm sẽ thất bại với ngoại lệ sau

[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
4

Bâ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"
5

Cuố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"
6

Trướ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"
7

Chạy thử nghiệm

[env]$ export APP_SETTINGS="project.server.config.DevelopmentConfig"
8

Theo 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"
9

Tươ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'
        ]
0

Loại bỏ các quảng cáo

Mã 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'
        ]
1

Có 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'
        ]
2

Bâ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'
        ]
3

Là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'
        ]
4

Về 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. 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'
        ]
5

Chạ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ẻ Email

Bà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

Làm cách nào để tạo mã thông báo JWT bằng Python?

Trước hết, hãy tạo một thư mục trong hệ thống của bạn cho dự án này và sau đó cài đặt FastAPI, uvicorn và python-jose để tạo và xác minh mã thông báo JWT trong Python. Use these commands to install these packages. After successful installation of these libraries, we can easily create out JWT and test it with FastAPI.

Làm cách nào để đọc mã thông báo JWT trong Python?

Thư viện PyJWT có tùy chọn giải mã JWT mà không cần xác minh . Nếu không có tùy chọn này, chức năng giải mã không chỉ giải mã mã thông báo mà còn xác minh chữ ký và bạn sẽ phải cung cấp khóa phù hợp. Và đó tất nhiên là cách được đề xuất.

Mã thông báo JWT trong Python là gì?

Mã thông báo Web JSON, hay gọi tắt là JWT, đều có trên web. Chúng có thể được sử dụng để theo dõi các bit thông tin về người dùng theo cách rất nhỏ gọn và có thể được sử dụng trong API cho mục đích ủy quyền . Bài đăng này sẽ đề cập đến Mã thông báo web JSON là gì và cách tạo JWT trong Python bằng thư viện JWT phổ biến nhất. PyJWT.

Làm cách nào để tạo mã thông báo bằng Python?

Gọi phương thức generate_token[] trả về một chuỗi. Chuỗi này là mã thông báo. Phương thức nhận các đối số sau. session_id [String] — ID phiên tương ứng với phiên mà người dùng sẽ kết nối.

Chủ Đề