File size: 2,860 Bytes
84380cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import jwt
import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from flask import request, jsonify, current_app
from functools import wraps
import os

class Authentication:
    def __init__(self):
        self.secret_key = os.getenv('JWT_SECRET_KEY', 'your-secret-key-here')
        self.algorithm = 'HS256'
    
    def generate_token(self, user_id, username, role='student'):
        """تولید توکن JWT"""
        try:
            payload = {
                'exp': datetime.datetime.utcnow() + datetime.timedelta(days=7),
                'iat': datetime.datetime.utcnow(),
                'sub': user_id,
                'username': username,
                'role': role
            }
            return jwt.encode(payload, self.secret_key, algorithm=self.algorithm)
        except Exception as e:
            print(f"Token generation error: {e}")
            return None
    
    def verify_token(self, token):
        """اعتبارسنجی توکن JWT"""
        try:
            payload = jwt.decode(token, self.secret_key, algorithms=[self.algorithm])
            return payload
        except jwt.ExpiredSignatureError:
            print("Token expired")
            return None
        except jwt.InvalidTokenError:
            print("Invalid token")
            return None
    
    def hash_password(self, password):
        """هش کردن رمز عبور"""
        return generate_password_hash(password)
    
    def check_password(self, hashed_password, password):
        """بررسی تطابق رمز عبور"""
        return check_password_hash(hashed_password, password)
    
    def login_required(self, f):
        """دکوراتور برای نیاز به احراز هویت"""
        @wraps(f)
        def decorated(*args, **kwargs):
            token = None
            
            # دریافت توکن از هدر
            if 'Authorization' in request.headers:
                auth_header = request.headers['Authorization']
                try:
                    token = auth_header.split(" ")[1]
                except IndexError:
                    return jsonify({'message': 'Invalid token format'}), 401
            
            if not token:
                return jsonify({'message': 'Token is missing'}), 401
            
            # اعتبارسنجی توکن
            payload = self.verify_token(token)
            if not payload:
                return jsonify({'message': 'Invalid token'}), 401
            
            # ذخیره اطلاعات کاربر در request
            request.user_id = payload['sub']
            request.username = payload['username']
            request.user_role = payload['role']
            
            return f(*args, **kwargs)
        return decorated

# نمونه singleton
auth_manager = Authentication()