6.2 验证码接口

验证码接口用于登录页面展示时,获取验证码图片地址及验证码标识

安装验证码功能组件(如果是官网下载的完整版框架,无需安装)

composer require topthink/think-captcha 1.*

设置路由,application/route.php中,adminapi域名路由部分,增加代码如下

//验证码图片
Route::get('captcha/:id', "\\think\\captcha\\CaptchaController@index");//访问图片需要
Route::get('captcha', 'adminapi/login/captcha');

  

在login控制器中添加

<?php

namespace app\adminapi\controller;

use think\Controller;

class Login extends BaseApi
{
/**
* 获取验证码图片地址
*/
public function captcha()
{
//验证码标识
$uniqid = uniqid(mt_rand(100000, 999999));
//返回数据 验证码图片路径、验证码标识
$data = [
'src' => captcha_src($uniqid),
'uniqid' => $uniqid
];
$this->ok($data);
}
}

测试:浏览器或者postman 访问 http://adminapi.pyg.com/captcha

{
"code":200,
"msg":"success",
"data":{
"src":"http:\/\/adminapi.pyg.com\/captcha\/7873845d27250ede217.html",
"uniqid":"7873845d27250ede217"
}
}

可根据实际需要,对验证码进行自定义配置: application/config.php

验证码组件,默认将验证码中的字符,存放在session中。

考虑到部分客户端(比如手机app) ,一般不使用session(显示验证码的请求和登录的请求,其session会话彼此独立)。

可修改组件源代码如下:

vendor/topthink/think-captcha/src/Captcha.php 的entry方法中

后续验证时,先从缓存取出对应的session_id, 并设置session_id。 见登录接口。

登录接口

①创建管理员模型(注意 管理员表为 pyg_admin 对应模型名称 为 Admin)

②设置路由,application/route.php中,adminapi域名路由部分,增加代码如下

//登录
Route::post('login', 'adminapi/login/login');

③封装密码加密函数

注意:后台管理员表tpshop_admin中 初始的管理员密码,需要自己加密一个初始密码,更新到数据表

使用自定义的密码加密函数:

④登录功能

/**
* 登录接口
*/
public function login()
{
//获取输入变量
$param = input();
$validate = $this->validate($param, [
'username' => 'require',
'password' => 'require',
'code' => 'require',
'uniqid' => 'require'
]);
if($validate !== true){
$this->fail($validate);
}
//根据验证码标识,从缓存取出session_id 并重新设置session_id
session_id(cache('session_id_'.$param['uniqid']));
//进行验证码校验 使用手动验证方法
if (!captcha_check($param['code'], $param['uniqid'])) {
//验证码错误
$this->fail('验证码错误');
}
//根据用户名和密码(加密后的密码),查询管理员用户表
$where = [
'username' => $param['username'],
'password' => encrypt_password($param['password'])
];
$info = \app\common\model\Admin::where($where)->find();
if(!$info){
//用户名或者密码错误
$this->fail('用户名或者密码错误');
}
$data['token'] = \tools\jwt\Token::getToken($info->id);
$data['user_id'] = $info->id;
$data['username'] = $info->username;
$data['nickname'] = $info->nickname;
$data['email'] = $info->email;
//登录成功
$this->ok($data);
}

退出接口

/**
* 后台退出接口
*/
public function logout()
{
//清空token 将需清空的token存入缓存,再次使用时,会读取缓存进行判断
$token = \Token::getRequestToken();
$delete_token = cache('delete_token') ?: [];
$delete_token[] = $token;
cache('delete_token', $delete_token, 86400);
$this->ok();
}

登录检测

除了登录相关接口,其他接口都需要登录后才能访问。

在application/adminapi/controller/BaseApi.php中进行检测。

①设置无需检测方法列表

//无需进行登录检测的请求
protected $no_login = ['login/login', 'login/captcha'];

②进行检测

 try{
$path = strtolower($this->request->controller()) . '/' . $this->request->action();
if(!in_array($path, $this->no_login)){
$user_id = \tools\jwt\Token::getUserId();
//登录验证
if(empty($user_id)){
$this->fail('未登录或Token无效', 403);
}
//将获取的用户id 设置到请求信息中
$this->request->get(['user_id' => $user_id]);
$this->request->post(['user_id' => $user_id]);
}
}catch(\Exception $e){
$this->fail('服务异常,请检查token令牌', 403);
}

JWT之登录、登出、验证码接口的更多相关文章

  1. flask 实现登录 登出 检查登录状态 的两种方法的总结

    这里我是根据两个项目的实际情况做的总结,方法一(来自项目一)的登录用的是用户名(字符串)和密码,前后端不分离,用form表单传递数据:方法二用的是手机号和密码登录,前后端分离,以json格式传递数据, ...

  2. Struts2学习第六课 实现登录登出功能

    关于Struts2请求的扩展名问题: 1).org.apache.struts2包下的default.properties中配置了struts2应用的一些常量 2).struts.action.ext ...

  3. ThinkPHP---案例1登录登出和添加部门

    配置文件分3类:系统配置文件,分组配置文件,应用配置文件 ①系统配置文件ThinkPHP/Conf/convention.php: ②分组 / 模块 /平台配置文件Home/Conf/config.p ...

  4. Django项目: 4.用户登录登出功能

    用户登录登出功能 一.功能需求分析 1. 登录退出功能分析 流程图 功能 登录页面 登录功能 退出功能 二.登录页面 1. 接口设计 接口说明 类目 说明 请求方法 GET url定义 /user/l ...

  5. SpringBoot登录登出切面开发

    阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验, ...

  6. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  7. jquery ajax常用的登录登出

    整理jquery+ajax的登录登出方法. //登录 var currentUserId = -1; $(function() { var timestamp = (new Date()).value ...

  8. Vue 登录/登出以及JWT认证

    1. 后端代码概览 server/router/index.js 请求 router.get('/getUserInfo', function (req, res, next) { // 登录请求 r ...

  9. 利用Vue.js实现登录/登出以及JWT认证

    JSON Web Token 入门教程:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html 后端代码地址:https ...

  10. CAS5.3 单点登录/登出/springboot/springmvc

    环境: jdk:1.8 cas server:5.3.14 + tomcat 8.5 cas client:3.5.1 客户端1:springmvc 传统web项目(使用web.xml) 客户端2:s ...

随机推荐

  1. day39-Spring 18-Spring的JDBC模板:查询的操作

    package cn.itcast.spring3.demo2; import java.sql.ResultSet; import java.sql.SQLException; import jav ...

  2. 【记录Bug】 This is probably not a problem with npm. There is likely additional logging output above.

    一个eslint的错误 我的报错如下 $ npm install > node-sass@4.11.0 install C:\Users\Administrator\Desktop\forGit ...

  3. 基于Spark Mllib的Spark NLP库

    SparkNLP的官方文档 1>sbt引入: scala为2.11时 libraryDependencies += "com.johnsnowlabs.nlp" %% &qu ...

  4. poj 2385【动态规划】

    poj 2385 Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14007   Accepte ...

  5. Flutter SDK path为空导致工程打开后不显示iOS模拟器的问题

    说明下问题场景,面向git编程时下载了个开源的Flutter项目 Mac系统下AndroidStudio打开工程后,发现顶部不展示iPhone模拟器 根据ide浅黄色提示提示,判断是FlutterSD ...

  6. MaxCompute 费用暴涨之新增SQL分区裁剪失败

    现象:因业务需求新增了SQL任务,这SQL扫描的表为分区表,且SQL条件里表只指定了一个分区,按指定的分区来看数据量并不大,但是SQL的费用非常高.费用比预想的结果相差几倍甚至10倍以上. 若只知道总 ...

  7. 原生js实现复制文本到粘贴板

    项目中经常会遇到点击按钮复制订单号.订单id等内容到粘贴板中的需求.可是通常我们都是用Ctrl + c或右击复制的,别操心,js也是有复制命令的,那就是document.execCommand('co ...

  8. C#判断文件是否被混淆

    可以使用混淆工具对一个DLL 和 exe 进行混淆. 但是如何知道一个文件是否已经混淆了. 在发布之前,需要知道是不是有文件忘了混淆. 要判断文件是否混淆,必须知道常用的混淆手法. 混淆就是因为编写的 ...

  9. SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

    数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发 ...

  10. HDU-6290_奢侈的旅行(Dijstra+堆优化)

    奢侈的旅行 Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) Problem De ...