前言:
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); }