2016-08-28 82 views
1

我正在PHP中創建一個REST API,並且我在理解我與過期令牌有關的概念時遇到了一些問題。我有用於認證部分的MYSQL和Json Web令牌。PHP REST API令牌過期流程

DB結構

CREATE TABLE `users` (
    `id` int(11) NOT NULL, 
    `name` varchar(35) CHARACTER SET utf8 NOT NULL, 
    `lastname` varchar(35) CHARACTER SET utf8 DEFAULT NULL, 
    `password` text CHARACTER SET utf8 NOT NULL, 
    `email` varchar(50) CHARACTER SET utf8 NOT NULL, 
    `gender` enum('male','female') CHARACTER SET utf8 DEFAULT NULL, 
    `description` text CHARACTER SET utf8, 
    `email_verification` enum('unverified','verified','','') CHARACTER SET utf8 NOT NULL DEFAULT 'unverified', 
    `updated` datetime NOT NULL, 
    `created` datetime NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

CREATE TABLE `device_tokens` (
    `id` int(11) NOT NULL, 
    `device_id` tinyint(4) NOT NULL, 
    `device_version` varchar(10) DEFAULT NULL, 
    `user_id` int(11) NOT NULL, 
    `token` text NOT NULL, 
    `update` datetime NOT NULL, 
    `created` datetime NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

LOGIN

我創建的用戶名和密碼POST請求,如果確認是正確的我返回一個訪問令牌(JSON網絡令牌)其中包含以下數據:

  • 電郵
  • user_creation_date
  • 到期時間

註銷 我創建具有的access_token,DEVICE_TYPE和user_ID的POST請求。但是如果令牌已經過期會發生什麼?我剛剛刪除?

另一個端點

for example 
/pets?id=1 

我創建具有的access_token,USER_ID和xx_id GET請求,所以才返回數據。我驗證令牌是否正確,以及令牌是否與正在發出請求的用戶相對應。但是,如果令牌已過期會發生什麼情況?我創造另一個?在我必須退還另一個未過期的令牌的情況下,是否應該註銷用戶並再次詢問密碼和電子郵件?

我不明白什麼是做到這一點的最佳方式。在我創建的關於認證的其他文章中,許多用戶建議我使用第三方認證系統,但我想自己開發它。

感謝所有

回答

1

通常如果令牌已過期,你應該從數據庫中刪除,並註銷用戶。但是,如果用戶處於活動狀態,應該可以在他的服務請求期間延長其訪問令牌的生命週期。但是,當引入附加參數刷新令牌時,還有另一種方法。在這種情況下,流程可能如下所示:

  1. 用戶登錄到您的系統。生成兩個令牌訪問和刷新
  2. 用戶請求不同的端點並僅發送訪問令牌。
  3. 訪問令牌已過期。用戶發送刷新令牌以延長其會話的生命週期。
  4. 刷新令牌無效或過期,則系統會註銷用戶。
  5. 刷新令牌有效,則訪問令牌生存時間被延長。
  6. 用戶很高興,可以繼續使用您的服務。
+0

首先,感謝您的幫助。所以我創建了一個訪問令牌和一個刷新令牌,並將其發送給客戶端。客戶端存儲這兩個字段,並且在發出請求並且訪問令牌過期時,客戶端必須使用refresh令牌發出另一個請求? – JIFT

+0

是的,你是對的。但是,如果訪問令牌已過期或無效,則使用不同的響應代碼。如果它已過期,客戶端應發送刷新令牌。如果無效,用戶必須重新登錄。 @JIFT –