zoukankan      html  css  js  c++  java
  • 关于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);
        }

     

          

  • 相关阅读:
    WebRTC的一个例子
    Gerrit增加SSL证书
    Ruby on Rails 创建https应用
    使用Ruby来实现批量更新AD中字段
    pg gem 安装(postgresql94)
    Spark源码剖析(一):如何将spark源码导入到IDEA中
    Scala入门系列(十三):类型参数
    Scala入门系列(十二):隐式转换
    Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96
    Scala入门系列(十一):模式匹配
  • 原文地址:https://www.cnblogs.com/lz0925/p/10573799.html
Copyright © 2011-2022 走看看