Tôi muốn sử dụng các phương pháp và tài nguyên từ mã của trang web được phát triển trong PHPFox.Làm cách nào để triển khai 'Xác thực dựa trên mã thông báo' một cách an toàn để truy cập vào tài nguyên của trang web (tức là các hàm và dữ liệu) được phát triển trong PHPFox?
Về cơ bản, tôi sẽ nhận được yêu cầu từ iPhone/Android
, tôi sẽ nhận yêu cầu và chuyển đến hàm tương ứng từ mã PHPFox, nhận phản hồi từ chức năng đó và trả lại cho thiết bị.
Vì mục đích này, tôi đã phát triển API REST bằng cách sử dụng Khuôn khổ mỏng.
Nhưng trình chặn chính tôi đang đối mặt hiện đang truy cập các tài nguyên (ví dụ: chức năng và dữ liệu) của trang web PHPFox.
Tôi không hiểu làm cách nào để xác thực người dùng bằng cách sử dụng 'Xác thực dựa trên mã thông báo' để truy cập tài nguyên của trang web.
Nếu ai đó có thể hướng dẫn tôi đúng hướng với một số ví dụ làm việc hữu ích, nó sẽ thực sự hữu ích cho tôi.
N.B. : Việc thực hiện đề xuất 'Xác thực dựa trên mã thông báo' phải rất an toàn và nhanh về tốc độ. Bảo mật không nên bị xâm phạm theo bất kỳ cách nào.
Sau đây là mã tôi đã tự thử nhưng tôi không biết nó có đúng hay sai. Cách tiếp cận của tôi đúng hay sai. Xin vui lòng ai đó phân tích nó và cho tôi biết phản hồi của bạn về nó.
Để tạo một mã thông báo tôi sử dụng chức năng này mà mất như thông số, dữ liệu của người dùng
define('SECRET_KEY', "fakesecretkey");
function createToken($data)
{
/* Create a part of token using secretKey and other stuff */
$tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; // It can be 'stronger' of course
/* Encoding token */
$token = hash('sha256', $tokenGeneric.$data);
return array('token' => $token, 'userData' => $data);
}
Vì vậy, người dùng có thể authentified bản thân và nhận được một mảng chứa một mã thông báo (genericPart + dữ liệu của mình, mã hóa), và hisData không mã hóa:
function auth($login, $password)
{
// we check user. For instance, it's ok, and we get his ID and his role.
$userID = 1;
$userRole = "admin";
// Concatenating data with TIME
$data = time()."_".$userID."-".$userRole;
$token = createToken($data);
echo json_encode($token);
}
Sau đó, người dùng có thể gửi cho tôi thẻ của mình + dữ liệu un-mã hóa của mình để kiểm tra:
define('VALIDITY_TIME', 3600);
function checkToken($receivedToken, $receivedData)
{
/* Recreate the generic part of token using secretKey and other stuff */
$tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"];
// We create a token which should match
$token = hash('sha256', $tokenGeneric.$receivedData);
// We check if token is ok !
if ($receivedToken != $token)
{
echo 'wrong Token !';
return false;
}
list($tokenDate, $userData) = explode("_", $receivedData);
// here we compare tokenDate with current time using VALIDITY_TIME to check if the token is expired
// if token expired we return false
// otherwise it's ok and we return a new token
return createToken(time()."#".$userData);
}
$check = checkToken($_GET['token'], $_GET['data']);
if ($check !== false)
echo json_encode(array("secureData" => "Oo")); // And we add the new token for the next request
Tôi có đúng không?
Cảm ơn.
Trước hết, xin cảm ơn sự quan tâm đến vấn đề của tôi và làm cho tôi hiểu 'Thực sự xác thực dựa trên mã' thực sự là gì. Nhưng bạn có thể vui lòng cung cấp cho tôi ví dụ làm việc của php-jwt từ đầu để tôi có thể sao chép vào hệ thống của tôi không. Mã nên bao gồm mọi thứ ngay từ việc tạo bảng cơ sở dữ liệu, kết nối giữa PHP và MySQL, sau đó tạo mã thông báo bảo mật, kiểm tra tính hợp lệ của mã thông báo bảo mật cho người dùng đã đăng nhập hiện tại, v.v. Một điều nữa có thể có nhiều hơn một người dùng đăng nhập tại một thời điểm và cho mỗi người dùng 'Xác thực dựa trên mã thông báo' này sẽ hoạt động. TY. – user2839497
Xin hãy xem phần cuối của phần thân câu hỏi của tôi. Tôi đã thử một mã. Bạn có thể vui lòng kiểm tra xem nó có chính xác hay không. Tôi có làm đúng hay không? – user2839497
Có khu vực để cải thiện nhưng không sao cả. Những gì bạn phải làm là sử dụng php-jwt để tạo và xác nhận mã thông báo. Tôi sẽ tốt hơn nhiều. Nhưng điều này là hoàn toàn quá. – Techie