Dalam aplikasi web moden, pengesahan dan kebenaran pengguna merupakan langkah keselamatan yang sangat kritikal. Dengan populariti dan penggunaan Python, Flask-RESTful dan Flask-JWT telah menjadi penyelesaian pilihan untuk pengesahan dan kebenaran pengguna dalam aplikasi web Python. Artikel ini akan memperkenalkan secara terperinci penggunaan Flask-RESTful dan Flask-JWT, dan cara melaksanakan pengesahan dan kebenaran pengguna dalam aplikasi web Python.
Pengenalan kepada Flask-RESTful
Flask-RESTful ialah perpustakaan lanjutan Flask yang boleh membantu membina antara muka API RESTful dengan cepat. Ia menyediakan banyak fungsi berguna, seperti pengesahan input, parsing permintaan, dsb. Dengan Flask-RESTful, kami boleh membina API Web ringkas dengan mudah. Berikut ialah contoh mudah:
from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True)
Dalam contoh ini, kami mencipta sumber bernama HelloWorld
dan menambahkannya pada objek api
. Akhir sekali, kita boleh mengakses sumber /
melalui laluan HelloWorld
. Apabila kita mengakses laluan /
, kaedah HelloWorld
sumber get
dipanggil dan respons JSON {'hello': 'world'}
dikembalikan.
Pengenalan kepada Flask-JWT
Flask-JWT ialah satu lagi perpustakaan sambungan untuk Flask untuk melaksanakan pengesahan JSON Web Token (JWT) dalam aplikasi web. JWT ialah standard terbuka untuk menghantar maklumat dengan selamat antara pengguna dan pelayan. Ia berdasarkan JSON dan biasanya terdiri daripada tiga bahagian, iaitu pengepala, muatan dan tandatangan. Pengepala mengandungi jenis JWT dan maklumat algoritma yang digunakan, muatan mengandungi maklumat data yang perlu dihantar, dan tandatangan digunakan untuk mengesahkan sama ada data itu betul. Flask-JWT memudahkan penjanaan dan pengesahan JWT, menjadikannya lebih mudah untuk melaksanakan pengesahan pengguna dalam aplikasi web. Berikut ialah contoh mudah:
from flask import Flask from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' class User(object): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}', username='{self.username}')" users = [ User(1, 'user1', 'password'), User(2, 'user2', 'password') ] username_table = {u.username: u for u in users} userid_table = {u.id: u for u in users} def authenticate(username, password): user = username_table.get(username, None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) @app.route('/protected') @jwt_required() def protected(): return {'hello': current_identity.username} if __name__ == '__main__': app.run(debug=True)
Dalam contoh ini, kami mula-mula mentakrifkan kelas User
untuk menyimpan maklumat pengesahan pengguna. Dalam fungsi authenticate
, masukkan nama pengguna dan kata laluan, dan fungsi itu akan mengembalikan objek pengguna. Dalam fungsi identity
, masukkan muatan jwt, dan fungsi tersebut akan mengembalikan objek pengguna berdasarkan id pengguna dalam jwt. Dengan memanggil pembina JWT
, kami menambah kaedah pengesahan tersuai dan kaedah pengenalan pengguna tersuai pada aplikasi. Akhir sekali, protected
penghias digunakan dalam @jwt_required
penghias laluan untuk memastikan bahawa hanya pengguna yang disahkan boleh mengakses sumber yang dilindungi.
Gabungan Flask-RESTful dan Flask-JWT
Kita boleh menggunakan Flask-RESTful dan Flask-JWT bersama-sama untuk melaksanakan aplikasi web yang lengkap, termasuk mekanisme pengesahan dan kebenaran pengguna. Berikut ialah contoh mudah:
from flask import Flask from flask_restful import Resource, Api, reqparse from flask_jwt import JWT, jwt_required, current_identity from werkzeug.security import safe_str_cmp app = Flask(__name__) app.config['SECRET_KEY'] = 'super-secret' api = Api(app) class User(object): def __init__(self, id, username, password): self.id = id self.username = username self.password = password def __str__(self): return f"User(id='{self.id}', username='{self.username}')" users = [ User(1, 'user1', 'password'), User(2, 'user2', 'password') ] username_table = {u.username: u for u in users} userid_table = {u.id: u for u in users} def authenticate(username, password): user = username_table.get(username, None) if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')): return user def identity(payload): user_id = payload['identity'] return userid_table.get(user_id, None) jwt = JWT(app, authenticate, identity) class HelloWorld(Resource): def get(self): return {'hello': 'world'} class Secret(Resource): @jwt_required() def get(self): return {'secret': 'resource', 'user': current_identity.username} class Login(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument('username', type=str, help='Username cannot be blank', required=True) parser.add_argument('password', type=str, help='Password cannot be blank', required=True) args = parser.parse_args() user = authenticate(args['username'], args['password']) if user: return {'access_token': jwt.jwt_encode_callback({'identity': user.id})} else: return {'message': 'Invalid username or password'}, 401 api.add_resource(HelloWorld, '/') api.add_resource(Secret, '/secret') api.add_resource(Login, '/login') if __name__ == '__main__': app.run(debug=True)
Dalam contoh ini, sebagai tambahan kepada sumber HelloWorld
, kami juga mentakrifkan sumber Secret
dan sumber Login
. Dalam sumber Secret
, lulus @jwt_required
penghias untuk memastikan bahawa hanya pengguna yang disahkan mempunyai akses. Dalam sumber Login
, kami menghuraikan permintaan POST dan menggunakan fungsi authenticate
untuk mengesahkan maklumat identiti pengguna. Jika pengesahan berjaya, token JWT dikembalikan, jika tidak, kod status 401 dikembalikan. Akhir sekali, kami menambah semua sumber pada objek api
dan melancarkan aplikasi web menggunakan kaedah run
Flask.
Ringkasan
Dalam pembangunan aplikasi web Python, Flask-RESTful dan Flask-JWT ialah perpustakaan sambungan yang sangat berguna. Melaluinya, kami boleh membina dan melindungi API Web dengan mudah serta menambahkan mekanisme pengesahan dan kebenaran pengguna pada aplikasi web. Menggunakan Flask-RESTful dan Flask-JWT boleh mengurangkan masa pembangunan dan kos pembangunan kami, menjadikannya lebih mudah untuk kami melaksanakan fungsi aplikasi web.
Atas ialah kandungan terperinci Flask-RESTful dan Flask-JWT: Pengesahan dan kebenaran pengguna dalam aplikasi web Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!