Thiết lập hệ thống xác thực người dùng với Redis và pickle
Trong một ứng dụng Django REST Framework, việc lưu trữ token phiên đăng nhập hiệu quả cần sử dụng cơ sở dữ liệu nhanh như Redis. Dưới đây là cách triển khai một lớp xác thực tùy chỉnh sử dụng pickle để mã hóa đối tượng người dùng và lưu vào Redis.
from rest_framework.authentication import BaseAuthentication
from django_redis import get_redis_connection
import pickle
from app.models import User
from rest_framework import exceptions
class MyAuthentication(BaseAuthentication):
def authenticate(self, request):
# Lấy token từ query string
token = request.GET.get('token')
# Kết nối tới Redis
conn = get_redis_connection()
stored_token = conn.get('token')
if not stored_token:
raise exceptions.AuthenticationFailed('Token không tồn tại')
# Giải mã token từ bytes sang object
try:
user_name = pickle.loads(stored_token)
except Exception:
raise exceptions.AuthenticationFailed('Token không hợp lệ')
# Tìm người dùng trong cơ sở dữ liệu
user = User.objects.filter(name=user_name).first()
if user and str(user.name) == token:
return user, token
else:
raise exceptions.AuthenticationFailed('Xác thực thất bại')
Xử lý dữ liệu byte khi nhận từ Redis
Khi đọc dữ liệu từ Redis, kết quả luôn là kiểu bytes. Việc chuyển đổi thành chuỗi UTF-8 cần chú ý đến các ký tự lỗi. Sử dụng decode('utf-8', 'ignore') giúp loại bỏ các ký tự không hợp lệ mà không làm lỗi toàn bộ quá trình.
# Ví dụ xử lý dữ liệu từ Redis
stored_data = conn.get('key')
if stored_data:
decoded_str = stored_data.decode('utf-8', 'ignore') # Bỏ qua ký tự lỗi
print(decoded_str)
Tích hợp thanh toán thử nghiệm với Alipay Sandbox
Để kiểm thử tính năng thanh toán, bạn cần cấu hình môi trường sandbox của Alipay. Các thông tin cần thiết bao gồm:
- App ID:
2016092500594669 - URL trả về (return_url):
http://42.56.89.12:80/page2/ - URL thông báo (notify_url):
http://42.56.89.12:80/page2/ - Chìa khóa riêng (merchant_private_key_path):
keys/app_private_2048.txt - Chìa khóa công khai (alipay_public_key_path):
keys/alipay_public_2048.txt
from alipay import AliPay
alipay = AliPay(
appid="2016092500594669",
app_notify_url="http://42.56.89.12:80/page2/",
return_url="http://42.56.89.12:80/page2/",
app_private_key_path="keys/app_private_2048.txt",
alipay_public_key_path="keys/alipay_public_2048.txt",
debug=True # Môi trường sandbox
)
Quy trình thanh toán Alipay
- Tạo đối tượng
AliPayvới các tham số đã cấu hình. - Gọi phương thức
direct_pay()truyền vào mô tả sản phẩm, mã đơn hàng, giá tiền. - Nhận chuỗi URL được sinh ra, ghép vào cổng thanh toán của Alipay.
- Gửi yêu cầu GET đến cổng thanh toán để hiển thị trang thanh toán.
- Sau khi thanh toán thành công, Alipay sẽ gửi hai phản hồi:
- GET callback: Hiển thị kết quả cho người dùng.
- POST callback: Xác minh chữ ký và cập nhật trạng thái đơn hàng.
- Luôn kiểm tra chữ ký bằng
alipay.verify()trước khi xử lý.
Tích hợp thông báo qua WeChat (Service Account)
WeChat cung cấp nhiều kênh thông báo: email, SMS, hoặc WeChat. Trong đó, Service Account cho phép gửi tin nhắn chủ động sau khi người dùng theo dõi.
Các bước triển khai:
- Người dùng quét mã QR để theo dõi Service Account.
- Mã QR chứa
redirect_urivà tham số định danh người dùng. - Khi người dùng xác nhận, WeChat gửi GET request đến endpoint của bạn (
/callback/) vớicodevàstate. - Sử dụng
codeđể gọi API lấyaccess_token. - Dùng
access_tokenvàopenidđể gửi tin nhắn (thông báo hoặc mẫu).
WECHAT_CONFIG = {
'app_id': 'wx20d174effe1375c3',
'appsecret': 'e679b86b37688423556027f6c0aa4e88',
'redirect_uri': 'http://42.56.89.12/callback/'
}
Chú ý: Cập nhật app_id, appsecret và đảm bảo redirect_uri phù hợp với miền thực tế khi triển khai.
Phân biệt các loại tài khoản WeChat
- Công chúng (Public Account): Không thể nhắn trực tiếp; giới hạn 1 bài/ngày nếu chưa xác thực.
- Service Account: Yêu cầu giấy phép doanh nghiệp; có thể gửi tin nhắn chủ động.
- Enterprise Account: Dành cho nội bộ doanh nghiệp, giao tiếp nội bộ.
Mọi mã QR đều đại diện cho một URL. Có thể chuyển đổi URL thành QR và ngược lại.