关于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); }