2015-03-18 15 views
18

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ả lời

61

Trước tiên, bạn nên hiểu xác thực dựa trên mã thông báo là gì. Nó có thể được giải thích như dưới đây.

Khái niệm chung đằng sau hệ thống xác thực dựa trên mã thông báo là đơn giản. Cho phép người dùng nhập tên người dùng và mật khẩu của họ để nhận mã thông báo cho phép họ tìm nạp tài nguyên cụ thể - mà không cần sử dụng tên người dùng và mật khẩu của họ. Khi mã thông báo của họ đã được thu được, người dùng có thể cung cấp mã thông báo - cung cấp quyền truy cập vào tài nguyên cụ thể trong một khoảng thời gian - tới trang web từ xa.

Read more

Bây giờ chúng ta hãy xem các bước thực hiện nó trong dịch vụ web REST của bạn là gì.

Nó sẽ sử dụng dòng chảy sau tầm kiểm soát:

  • Người dùng cung cấp một tên người dùng và mật khẩu trong biểu mẫu đăng nhập và nhấp chuột Log In.
  • Sau khi yêu cầu được thực hiện, hãy xác thực người dùng trên chương trình phụ trợ bằng cách truy vấn trong cơ sở dữ liệu. Nếu yêu cầu hợp lệ, hãy tạo mã thông báo bằng cách sử dụng thông tin người dùng được tìm nạp từ cơ sở dữ liệu và sau đó trả về thông tin đó trong tiêu đề phản hồi để chúng tôi có thể lưu trữ mã thông báo trình duyệt trong bộ nhớ cục bộ.
  • Cung cấp thông tin mã thông báo trong mỗi tiêu đề yêu cầu để truy cập điểm cuối bị hạn chế trong ứng dụng.
  • Nếu mã thông báo được tìm nạp từ thông tin tiêu đề yêu cầu hợp lệ, hãy để người dùng truy cập vào điểm kết thúc đã chỉ định và trả lời bằng JSON hoặc XML.

Xem hình ảnh dưới đây để biết dòng chảy của kiểm soát

enter image description here

Bạn có thể tự hỏi những gì là một JWT

JWT là viết tắt của JSON Web Mã và là một định dạng thẻ được sử dụng trong tiêu đề ủy quyền. Mã thông báo này giúp bạn thiết kế giao tiếp giữa hai hệ thống một cách an toàn. Hãy viết lại JWT là "mã thông báo mang số " cho các mục đích của hướng dẫn này. Mã thông báo có chứa ba phần: tiêu đề, tải trọng và chữ ký.

  • Tiêu đề là một phần của mã thông báo giữ loại mã thông báo và phương thức mã hóa, cũng được mã hóa bằng base-64.
  • Tải trọng bao gồm thông tin. Bạn có thể đặt bất kỳ loại dữ liệu nào như thông tin người dùng, thông tin sản phẩm, v.v., tất cả đều được lưu trữ với mã hóa base-64.
  • Chữ ký bao gồm các kết hợp của tiêu đề, trọng tải và khóa bí mật. Khóa bí mật phải được giữ an toàn ở phía máy chủ. Bạn có thể xem giản đồ JWT và mã thông báo mẫu bên dưới;

enter image description here

Bạn không cần phải thực hiện người mang máy phát thẻ như bạn có thể sử dụng php-jwt.

Hy vọng điều trên giải thích sự nhầm lẫn của bạn. nếu bạn gặp phải bất kỳ vấn đề nào, việc triển khai xác thực dựa trên mã thông báo cho tôi biết. Tôi có thể giúp bạn.

+0

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

+0

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

+1

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

Các vấn đề liên quan