Cách mã hóa jwt trong php?

Nó có thể nhận một mảng tham số và có thể tạo chuỗi mã thông báo theo đặc tả Mã thông báo Web JSON

Lớp cũng có thể lấy chuỗi mã thông báo JWT và giải mã nó để trích xuất các giá trị tham số mã thông báo ban đầu thành một mảng


tháng 6 năm 2022
Số 8JSON Web Token [JWT] là một tiêu chuẩn để mã hóa và truyền thông tin nhạy cảm về bảo mật bằng cách sử dụng định dạng JSON để mã hóa các đối tượng dưới dạng chuỗi

Lớp này cung cấp một phương tiện đơn giản để mã hóa và giải mã dữ liệu bằng tiêu chuẩn JWT

Các nhà phát triển có thể sử dụng lớp này với các thành phần khác triển khai các giao thức và biện pháp bảo mật phức tạp hơn, chẳng hạn như OAuth

Manuel Lemos

giải thưởng sáng tạo

đề cử. 5x


mô-đun đơn giản để giúp tạo mã thông báo đơn giản bằng cách sử dụng php

tạo một phiên bản mới của lớp JWT, sẽ giúp bạn tạo mã thông báo mới hoặc xác thực mã thông báo hiện có

    $data=[
        "data"=>"hello Github",
        "expired"=>300
    ];
    $tken= new JWT;
    $_token=$tken->generate[$data]
    echo $_token;

lớp Token có 2 Phương thức. * phát ra. sử dụng phương pháp này để tạo khóa mã thông báo mới. phải mất 2 tham số. - tham số đầu tiên là một mảng thông tin theo dữ liệu được mã hóa. nó có 2 phím. 1. data. nơi bạn có thể lưu trữ tất cả thông tin mà bạn muốn được mã hóa; . expired. [tùy chọn] mã thông báo của bạn sẽ được sử dụng trong bao lâu;

- tham số thứ hai [tùy chọn] là cypherkye để mã hóa dữ liệu của bạn, theo mặc định, mã thông báo tạo khóa cypherkey cho khóa mã thông báo

Mã thông báo web JSON [JWT] cho phép bạn triển khai xác thực không trạng thái [không sử dụng phiên phía máy chủ]. JWT được ký điện tử bằng khóa bí mật và có thể chứa nhiều thông tin khác nhau về người dùng. danh tính, vai trò, quyền, v.v. ở định dạng JSON. Thông tin này được mã hóa đơn giản và không được mã hóa. Tuy nhiên, do có chữ ký điện tử nên không thể sửa đổi tải trọng nếu không có quyền truy cập vào khóa bí mật

JWT là một chủ đề tương đối nóng vì chúng được sử dụng rộng rãi [đặc biệt là trong các ứng dụng một trang và API REST] ​​nhưng nhiều nhà phát triển không hiểu rõ về chúng. Trong bài đăng này, tôi sẽ thảo luận về JWT là gì, chúng giải quyết vấn đề gì, cách chúng hoạt động và cách sử dụng chúng một cách an toàn. Sau đó, tôi sẽ hướng dẫn bạn quy trình tạo và xác minh JWT từ đầu bằng PHP [và không có bất kỳ thư viện bên ngoài nào]. Cuối cùng, tôi sẽ chỉ cho bạn cách sử dụng thư viện JWT của Okta để tự động xử lý xác thực các JWT của Okta. Okta là một dịch vụ API cho phép bạn tạo, chỉnh sửa và lưu trữ an toàn tài khoản người dùng và dữ liệu tài khoản người dùng, đồng thời kết nối chúng với một hoặc nhiều ứng dụng. Đăng ký tài khoản nhà phát triển miễn phí mãi mãi và khi bạn hoàn tất, hãy quay lại để tìm hiểu thêm về JWT

Bí mật lớn về xác thực người dùng

Trong những ngày đen tối của Internet, đã có xác thực dựa trên phiên. Người dùng sẽ đăng nhập và nếu máy chủ chấp nhận thông tin đăng nhập của họ, nó sẽ tạo phiên cho họ [trong tệp, trong cơ sở dữ liệu hoặc trong kho dữ liệu khóa-giá trị trong bộ nhớ như Memcached hoặc Redis]. Sau đó, máy chủ sẽ gửi lại một cookie chứa

data = base64urlEncode[header] + "." + base64urlEncode[payload]
hashedData = hash[data, secret]
signature = base64urlEncode[hashedData]
8. Trình duyệt của người dùng sẽ cung cấp cookie cho mỗi yêu cầu tiếp theo và máy chủ sẽ biết danh tính của người dùng mà không cần liên tục hỏi tên người dùng và mật khẩu

Cách tiếp cận này có một số nhược điểm. ví dụ: nếu bạn muốn mở rộng quy mô theo chiều ngang, bạn sẽ cần một hệ thống lưu trữ trung tâm cho các phiên, đây là một điểm lỗi duy nhất. Tuy nhiên, hãy để tôi nói cho bạn một bí mật lớn. các phiên hoạt động trước đây và chúng vẫn hoạt động tốt đối với phần lớn các trường hợp sử dụng. Nếu tất cả những gì bạn có là một trang web đơn giản, nơi người dùng đăng ký, sau đó đăng nhập, sau đó nhấp chuột và thực hiện một số nội dung, phiên phía máy chủ là hoàn hảo. Tất cả các khung Web hiện đại vẫn hoạt động theo cách này theo mặc định. Bạn thậm chí có thể có tất cả các lợi ích về mật mã của JWT với các phiên đơn giản nếu bạn quan tâm đến điều đó

Tuy nhiên, JWT rất có ý nghĩa nếu bạn đang xây dựng các dịch vụ API hỗ trợ giao tiếp giữa máy với máy hoặc máy khách-máy chủ [như ứng dụng một trang hoặc ứng dụng di động]. Chúng cũng có ý nghĩa nếu có nhiều hơn hai bên tham gia vào một yêu cầu hoặc nếu bạn đang triển khai các hệ thống đăng nhập liên kết/đăng nhập một lần

JWT hoạt động như thế nào

Hệ thống xác thực phải cung cấp điểm cuối đăng nhập. Người dùng gửi thông tin đăng nhập của họ đến hệ thống đăng nhập [có thể là đăng nhập của bên thứ ba]. Sau khi đăng nhập thành công, máy chủ sẽ tạo JWT và gửi cho máy khách. Ứng dụng khách phải lưu trữ JWT này và chuyển nó với mỗi lệnh gọi API tiếp theo. Máy chủ có thể sử dụng JWT để xác minh rằng lệnh gọi API đến từ người dùng được ủy quyền. Hệ thống xác thực có thể xác minh tính toàn vẹn của JWT và tải trọng của nó chỉ bằng khóa bí mật [không có bất kỳ lệnh gọi nào đến cơ sở dữ liệu hoặc hoạt động mạng]

JWT có thể được ký bằng bí mật [với thuật toán HMAC] hoặc cặp khóa công khai/riêng tư bằng RSA hoặc ECDSA

Điều cực kỳ quan trọng là phải hiểu rằng JWT không ẩn hoặc che khuất dữ liệu mà chúng nắm giữ. Tải trọng được mã hóa tầm thường và không được mã hóa và người dùng có thể đọc nó [vì vậy không lưu trữ bất kỳ thứ gì nhạy cảm ở đó]. Chỉ chữ ký được mã hóa và máy chủ xác thực có thể sử dụng để xác minh rằng thông tin trong mã thông báo chưa bị sửa đổi

Lưu trữ và sử dụng JWT một cách an toàn

Ứng dụng khách sẽ lưu trữ JWT và gửi nó cùng với mọi yêu cầu tới API. Nếu mã thông báo bị đánh cắp, bên thứ ba độc hại có thể mạo danh người dùng hợp pháp miễn là mã thông báo hợp lệ. Do đó, điều quan trọng là phải thực hiện tất cả các biện pháp có thể để giữ an toàn cho mã thông báo

Có hai cách tiêu chuẩn để lưu trữ mã thông báo. trong bộ nhớ cục bộ/phiên của trình duyệt hoặc trong cookie. Dưới đây là những rủi ro chính và cân nhắc khi quyết định lựa chọn phương án nào

Tấn công kẻ đứng giữa – bạn cần đảm bảo rằng ứng dụng chỉ hoạt động trên https để không thể đánh cắp mã thông báo bằng cách chặn lưu lượng truy cập [e. g. trong mạng wi-fi công cộng]

Các cuộc tấn công Cross-Site Scripting [tiêm JavaScript, XSS] – bộ lưu trữ cục bộ/phiên có thể truy cập thông qua API JavaScript khiến nó dễ bị tấn công XSS [nếu tin tặc có thể thực hiện tấn công XSS thành công, cho phép chúng chạy JavaScript của riêng chúng bên trong . Việc bảo mật hoàn toàn một trang web khỏi các cuộc tấn công XSS không phải lúc nào cũng đơn giản, đặc biệt nếu trang web dựa trên nội dung do người dùng tạo. Do đó, tốt hơn hết là lưu trữ mã thông báo trong cookie

Các cuộc tấn công giả mạo yêu cầu trên nhiều trang web [CSRF] – đặt cờ chỉ https cho cookie giúp loại bỏ nguy cơ tấn công XSS hoặc tấn công trung gian [vì những cookie này không có sẵn cho JavaScript hoặc qua các kết nối không an toàn . Tuy nhiên, bạn vẫn cần xử lý rủi ro CSRF. Có nhiều cách khác nhau để làm điều đó – một tùy chọn đặc biệt hiệu quả là sử dụng thuộc tính cookie

data = base64urlEncode[header] + "." + base64urlEncode[payload]
hashedData = hash[data, secret]
signature = base64urlEncode[hashedData]
9. Hầu hết các khung ứng dụng Web hiện đại cũng bao gồm một số cách mặc định để xử lý CSRF

Còn một chủ đề cuối cùng tôi muốn thảo luận về bảo mật JWT – cách thu hồi quyền truy cập của người dùng [ví dụ: người dùng thông báo cho bạn rằng mã thông báo của họ bị xâm phạm, vì vậy bạn muốn buộc họ đăng nhập lại hoặc người dùng bị cấm

Không có câu trả lời dễ dàng vì bản chất không trạng thái của JWT – chúng tự cung cấp và [về mặt lý thuyết] nên bao gồm tất cả thông tin cần thiết về quyền của người dùng mà không cần tham khảo các nguồn bên ngoài. Điều này có nghĩa là bạn không thể buộc chúng hết hạn, vì vậy bạn phải giữ thời gian hết hạn ngắn [thường là 15 đến 60 phút và sử dụng mã thông báo làm mới được theo dõi ở phía máy chủ và được xác minh tính hợp lệ trước khi cấp lại mã thông báo truy cập]. Nếu bạn nhất định phải có khả năng loại bỏ người dùng ngay lập tức, thì bạn phải theo dõi từng mã thông báo truy cập ở phần phụ trợ và xác minh rằng nó không nằm trong danh sách đen đối với mọi yêu cầu – nhưng cách tiếp cận này làm mất đi lợi ích chính của JWT [xác thực không trạng thái] và bạn quay lại

Tóm lại, đây là cách an toàn để xử lý JWT

  • Ký mã thông báo của bạn bằng khóa mạnh và giữ cho thời gian hết hạn của chúng ở mức thấp
  • Lưu trữ chúng trong cookie chỉ có https
  • Sử dụng thuộc tính cookie
    {
        "require": {
            "vlucas/phpdotenv": "^2.4"
        },
        "autoload": {
            "psr-4": {
                "Src\\": "src/"
            }
        }
    }
    
    0 nếu nó không ảnh hưởng đến chức năng của ứng dụng của bạn
  • Sử dụng cách xử lý CSRF mặc định của khung ứng dụng Web của bạn nếu
    {
        "require": {
            "vlucas/phpdotenv": "^2.4"
        },
        "autoload": {
            "psr-4": {
                "Src\\": "src/"
            }
        }
    }
    
    0 không phải là một tùy chọn dành cho bạn
  • Xây dựng mã thông báo CSRF và mã phụ trợ của riêng bạn để xác minh từng yêu cầu biểu mẫu nếu bạn không đủ may mắn để sử dụng một khung không xử lý CSRF ngay lập tức
  • Luôn xác minh chữ ký ở phía máy chủ trước khi bạn tin tưởng bất kỳ thông tin nào trong JWT

Cấu trúc của một JWT

Bây giờ chúng ta hãy đi vào chi tiết cơ bản của việc xử lý JWT. Định nghĩa

“Mã thông báo web JSON [JWT] là một đối tượng JSON được định nghĩa trong RFC 7519 như một cách an toàn để biểu thị một tập hợp thông tin giữa hai bên. Mã thông báo bao gồm tiêu đề, tải trọng và chữ ký. ”

Vì vậy, JWT chỉ là một chuỗi ở định dạng này

header.payload.signature

Thành phần tiêu đề của JWT chứa thông tin về cách tính chữ ký JWT

Thành phần tải trọng của JWT là thông tin về người dùng được lưu trữ bên trong JWT [còn được gọi là 'yêu cầu' của JWT]

Chữ ký được tính như thế này

data = base64urlEncode[header] + "." + base64urlEncode[payload]
hashedData = hash[data, secret]
signature = base64urlEncode[hashedData]

Bí mật chỉ được biết bởi máy chủ xác thực [và máy chủ ứng dụng cung cấp API, nếu nó khác với máy chủ xác thực]

Tạo và xác thực JWT từ đầu bằng PHP

Chúng ta sẽ bắt đầu một dự án PHP mới bằng cách tạo một thư mục

{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
2 và một tệp
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
3 đơn giản chỉ với một phụ thuộc [hiện tại]. thư viện DotEnv sẽ cho phép chúng tôi giữ khóa bí mật của mình trong tệp
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
4 bên ngoài kho lưu trữ mã của chúng tôi

{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
3

{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}

Chúng tôi cũng đã định cấu hình trình tải tự động PSR-4 sẽ tự động tìm kiếm các lớp PHP trong thư mục

{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
2

Chúng tôi có thể cài đặt các phụ thuộc của mình ngay bây giờ

composer install

Chúng tôi có một thư mục

{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
7 và phần phụ thuộc DotEnv đã được cài đặt [chúng tôi cũng có thể sử dụng trình tải tự động của mình để tải các lớp của chúng tôi từ
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
2 mà không có lệnh gọi
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
9]

Hãy tạo một tệp

composer install
0 cho dự án của chúng tôi với hai dòng trong đó, vì vậy thư mục
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
7 và tệp
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
4 cục bộ của chúng tôi sẽ bị bỏ qua

composer install
0

/vendor
.env

Tiếp theo, chúng ta sẽ tạo một tệp

composer install
4 với một biến.
composer install
5 để giữ khóa bí mật của chúng tôi [được sử dụng khi tạo và xác minh JWT]

composer install
4

SECRET=

và chúng tôi sẽ sao chép

composer install
4 sang
{
    "require": {
        "vlucas/phpdotenv": "^2.4"
    },
    "autoload": {
        "psr-4": {
            "Src\\": "src/"
        }
    }
}
4 nơi chúng tôi sẽ điền vào khóa bí mật thực sự của mình [nó sẽ bị Git bỏ qua vì vậy nó sẽ không kết thúc trong kho lưu trữ của chúng tôi]

Chúng tôi sẽ cần một tệp

composer install
9 để tải các biến môi trường của chúng tôi [sau này, nó cũng sẽ thực hiện một số bước khởi động bổ sung cho dự án của chúng tôi]

composer install
9

Chủ Đề