關於token登錄邏輯分析


前言:

  token登錄上一家公司也寫過,迷迷糊糊的,

  現在做一個APP,需求為每次調用接口都會傳token,登錄注冊等特殊的除外,

  邏輯整理一下還是比較簡單的

  主要的問題還是,如何在框架中找到較好的插入點,這個框架沒有user/login的基類,框架結構簡單到爆,找不到插入點,

  好吧,明月幾時有,把酒問青天。

  寫一個application 文件專門給API的模塊使用,並在路由中區分API和mvc,進行不同的操作,在這里通過application 文件進行接口訪問的檢驗,比如簽名,登錄、接口是否存在等驗證,你說我一API,你給我返回個404頁面是干嘛的啊,愁~

思路:

  1、首先用戶表中添加token字段和token_time字段,token是md5()生成的32位字符串,token_time是上次刷新token的時間

  2、用戶注冊完可以沒有token,因為接下來會自動登錄一下,而且是通過用戶名登錄,使我們想要的味道,猥瑣~ ~

  3、通過用戶名密碼登錄的步驟:

      ⑴、通過用戶名拿到用戶信息$identity,並賦值給一個靜態變量, 后期業務時使用

      ⑵、對比密碼

      ⑶、判斷token是否超過刷新時間間隔(我設置86400秒)

      ⑷、不超過直接返回當前用戶的token

      ⑸、超過86400秒則刷新,md5生成新token

      ⑹、通過⑶、⑷、⑸  我們得到一個確定的token,現在將這個token以及現在的時間戳更新到用戶表中的token和token_time字段

      ⑺、登錄成功,將前端需要的用戶信息返回

  4、通過token登錄:

      ⑴、在application文件中會驗證用戶是否成功登錄,、每個人驗證的方式不同(我是驗證該接口是否需要登錄,需要登錄則用前端傳過來的token登錄),有的可能是驗證session'_id等,不討論

      ⑵ 、如果訪問的接口需要登錄,調用一個驗證方法

      ⑶、 在該方法中,先通過token查詢用戶,獲取用戶信息,並賦值給一個靜態變量,返回true或者false

      ⑷、上一步返回true,則說明用戶登錄成功,繼續接口的調用,並可以在接口中通過靜態變量獲取用戶的ID以及其他信息。

總結:

  通過token, 用戶每次調取接口的時候只需要傳token, 不用傳uid,我們就可以驗證身份並確定uid

僅提供用戶名密碼登錄的代碼進行參考

 

public function login($user_name, $passwd)
    {
        $identity = identity::find_by_username($user_name);
        if(!$identity || ($identity -> passwd !== $passwd && $identity -> passwd !== md5($passwd)))
        {
            return $this ->_formatreturndata(false, '賬號/密碼不正確');
        }
        unset($identity -> passwd);
        //根據刷新時間間隔是否超過,獲取一個token
        $token = $identity -> refresh_token($identity);
        //更新用戶表中的token和time
        $identity -> update_token($identity->id, $token);
        $identity -> token = $token;
        unset($identity -> refresh_time);
        return $this ->_formatreturndata(true, $identity);
    }

 

 

 

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM