本文实例讲述了thinkphp5框架API token身份验证功能。分享给大家供大家参考,具体如下:

使用说明:登陆时生成token和刷新用的refresh_token,返回给客户端,客户端收到保存本地localStorage等,每次访问接口带上token,后端验证token存在并且一致后方可执行接下来的动作,假如不存在就返回token过期,客户端调用刷新接口传入token和refresh_token,服务器端进行验证,验证通过重新生成新的token保存数据库,返回给客户端客户端刷新本地token访问即可继续,当refresh_token验证失败就清除数据库token,过期时间等信息

简单的token生成函数(公共函数文件common)

function create_token($id,$out_time){
  return substr(md5($id.$out_time),5,26);
}

验证登陆方法(模型)

public function checkLogin($username,$passwd){
    $driver = self::field('driver_id,passwd')->where('zhanghao',$username)->whereOr('phone',$username)->find();
    if (empty($driver)){
      $this->error = '账号不存在';
      return false;
    }
    if ($driver['passwd'] != md5($passwd)){
      $this->error = "密码不正确";
      return false;
    }
    //$out_time = strtotime('  1 days');
    $out_time = strtotime('  1 minutes');
    $token = create_token($driver['driver_id'],$out_time);
    if(false===self::save(['token'=>$token,'time_out'=>$out_time],['driver_id'=>$driver['driver_id']])){
      $this->error = '登陆失败';
      return false;
    }
    $refresh_token_out_time = strtotime('  5 days');
    $refresh_token = create_token($driver['driver_id'],$refresh_token_out_time);
    Cache::set("token",$token,60);
    Cache::set("driver_id",$driver['driver_id'],$refresh_token_out_time);//设置ID的过期时间和更新token的token时间一样用于更新的时候获取用户信息
    Cache::set('refresh_token',$refresh_token,$refresh_token_out_time);
    return ['token'=>$token,'refresh_token'=>$refresh_token,'in_expire'=>$out_time];
}

token刷新方法(模型)

public function refreshToken($refresh_token,$token){
    if (!isset(Cache::get('refresh_token')) or Cache::get('refresh_token')!=$refresh_token){
      $this->error = '刷新token失败';
      return false;
    }
    $cache_driver_id = Cache::get('driver_id');
    $driver = self::field('driver_id,passwd')->where('driver_id',$cache_driver_id)->where('token',$token)->find();
    if (empty($driver)){
      $this->error = '参数错误';
      return false;
    }
    $out_time = strtotime('  1 days');//新的过期时间
    $token = create_token($driver['driver_id'],$out_time);//更新token
    if(false===self::save(['token'=>$token,'time_out'=>$out_time],['driver_id'=>$driver['driver_id']])){
      Cache::clear($token);
      $this->error = '刷新失败';
      return false;
    }
    Cache::set("token",$token,864000);
    return ['token'=>$token,'in_expire'=>$out_time];
}

退出方法(模型)

public function logout($token,$refresh_token=''){
    $driver = self::field('driver_id,passwd')->where('token',$token)->find();
    self::save(['token'=>'','time_out'=>''],['token'=>$token]);
    Cache::clear('token');
    Cache::clear('refresh_token');
}

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

thinkphp5框架API token身份验证功能示例的更多相关文章

  1. 如何使用iOS SDK保存LinkedIn访问令牌?

    我在我的iOS应用程序中使用LinkedIn.我想保存访问令牌以供将来使用.令牌属于非属性类型,无法直接保存在NSUserDefaults中.我尝试使用NSKeyedArchiver,但我得到了输出:令牌中的文本即将到来,但值将为空.代码段1:我也尝试像这样保存,但结果是一样的:代码段2:我的编码或访问令牌有什么问题需要一些特殊技术来保存吗?请建议.解决方法这就是我拯救的方式.它对我有用.希望它有所帮助以这种方式使用保存的responseBody我希望这次我很清楚

  2. IOS Facebook身份验证使用node.js passport-facebook-token

    我正在尝试使用来自IOS应用程序的passport-facebook-token对node.jsapi进行身份验证.我有用户名和密码验证设置,并通过护照和护照-facebook-token设置正常工作.我只是无法弄清楚将访问令牌发送到API所需的HTTP请求语法.任何帮助都将受到大力赞赏.谢谢.解决方法确定设法从passport-facebook-token的策略文件中找出答案这个需要:http://URL?access_token=[访问令牌]从IOS我只是用以下方法测试:希望这有助于其他人.

  3. 解析条纹iOS main.js

    我真的很难让ParseStripe在我的项目中工作.此时,我想要最简单的工作版本,允许我向用户收费.我找到答案的最接近的事情如下:SimplestExampleI’veFound当我使用上面链接中的更正代码时,我的秘密得到以下错误:请帮助=**(这太令人沮丧了.————-更新—————-其他一些帖子也有类似的错误,看起来最新版本的ParseCloud代码应该归咎于:1.6.0.在控制台视图中使用以

  4. 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析

    一,总体架构1,引入第三方库除了必须引入对应的登录SDK外,额外引入了SDWebImage,SVProgressHUD,看名字大家都明白吧,引入登录SDK请各自看官方的开发文档,需要加入什么系统库文件,需要配置OtherLinkerFlags等,请参考各自官方文档即可;2,配置连接桥文件因为创建的工程是基于Swift语言,目前官方SDK和其它三方库都是用OC写的,所以为了在swift中调用oc代码

  5. 基于Swift语言开发微信、QQ跟微博的SSO授权登录代码分析

    转自:http://www.myexception.cn/swift/1991018.html前言Swift语言,怎么说呢,有一种先接受后排斥,又欢迎的感觉,纵观国外大牛开源框架或项目演示,Swift几乎占据了多半,而国内虽然出现很多相关技术介绍和教程,但是在真正项目开发中使用的占据很少部分,原因一是目前熟练它的开发者并不多,二是版本不太稳定,还需要更成熟可靠的版本支持,但总之未来还是很有前景的,

  6. Swift3 单例模式

    常见的有这么几种方法第一种最简单也是最常用的,这里的所有单例init方法一定要定义成private的,不然外部依然可以使用init方法初始化变量。final关键字的作用是这个类或方法不希望被继承和重写第二种第二种完全是OC风格的单例,但是由于Swift3中废弃了原来的dispatch_once_t,所以需要先给dispatchQueue添加一个extension,实现原先的dispatch_once_t效果第三种第四种在方法内定义静态变量

  7. 微信三方登录相关(Swift)

    微信登录条件1.微信开放平台注册并认证成功2.相关应用的微信的APPID和secret3.遵循微信代理WXApiDelegate使用处编写相关登录代码WXApi.registerappletreq=SendAuthReq.init()req.scope="snsapi_userinfo"req.state="wulianwang"WXApi.send在回调方法中处理相关业务funconResp(_resp:BaseResp!,options:.mutableContainers)/**正确时返回的JSON

  8. 如何替换位置代码使Swift 3兼容?

    我有以下类,它有方法getNextToken迭代数组项:但我有一个来自编译器的警告消息,将在Swift3中弃用我应该如何重写我的代码让方法在当前位置返回数组项并在此之后增加位置?添加一个行位置=1的标准建议不适合这里,因为我在评估令牌时正在退出范围[位置]延迟可用于增加位置变量在计算返回值之后:

  9. 如何使用Swift检查iOS设备是否被锁定/解锁?

    如何使用Swift检测锁定/解锁的iOS设备(如Android中的SCRENON/SCREENOFF)我使用以下来创建相同的想法.您需要使用桥接器将目标c代码用于swift.HereistheLinkforcreatethebridgebetweentheObjectivectoSwift.完成后,您可以将以下.h文件添加到您的项目–桥接–标题中.文件添加yourcontroller.h然后将No

  10. 如何在Swift中执行一次代码只执行一次?

    到目前为止我所看到的答案建议使用GCD的dispatch_once:输出:但等一下.token是一个变量,所以我可以很容易地做到这一点:输出:因此,如果我可以更改令牌的值,dispatch_once是没用的!有一种更安全的方式只执行一次代码吗?由闭包初始化的静态属性是懒惰运行的,最多只运行一次,所以这只打印一次,尽管被调用了两次:示例运行:

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部