为什么 退出登录 或 修改密码 无法使 token 失效
问题场景
解决方案
一、把 token 的有效期缩短,例如半小时或者五分钟,但有个明显的缺陷:用户需要频繁重新登录。
二、把 退出登录 的用户添加到 token black list 当中。
1. token black list 的设计
是否持久化?
数据结构设计
a. 多设备登录场景
TOKEN_BLACK_LIST_AId : tokenJson 写进了redis。TOKEN_BLACK_LIST_AId,此时认为用户 A 的 token 无效。jti{
"jti": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv",
"iss": "the issuer",
"aud": "the audience",
"exp": 1630003600,
"iat": 1630000000,
..
}
TOKEN_BLACK_LIST_tokenId],形如 "TOKEN_BLACK_LIST_a1b2c3d4-5678-90ef-ghij-klmnopqrstuv"。b. 修改密码场景
{
"jti": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv",
"iss": "the issuer",
"aud": "the audience",
"exp": 1630003600,
"iat": 1630000000,
..
}
iat 签发时间,假设 用户 A 在设备 D1 上确定 “修改密码” 的时间是 changedPasswordDate,changedPasswordDate 这个时间存储到 redis 上,设其 key 为 TOKEN_INVALIDATION_userId,value 为 changedPasswordDate;2. code implement
sign-out / change-password
public async Task<GlobalSignOutResponse> SignOutAsync(string accessToken)
{
var response = await _authService.SignOutAsync(accessToken);
await _redisCacheService.SetCache(TokenHelper.GetRedisKeyForBlackAccessToken(accessToken), accessToken, 1440); // 分钟单位
return response;
}
jwt authentication
startUp.cs
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
..
options.Events = new JwtBearerEvents
{
..
OnTokenValidated = async context =>
{
if (await IsAccessTokenExpired(context, services))
{
Log.Information($"The access token is expired as user already signed out or changed password.");
context.Fail(GetTokenExpiredResponse(context.Response));
}
await Task.CompletedTask;
}
};
});
private string GetTokenExpiredResponse(HttpResponse response)
{
if (ApiResponseCodes.AccessTokenExpired.BuildHttpResponse() is ObjectResult result)
{
var payload = JObject.FromObject(result.Value);
response.ContentType = "application/json";
response.StatusCode = 401;
return payload.ToString();
}
return string.Empty;
}
private async Task<bool> IsAccessTokenExpired(TokenValidatedContext context, IServiceCollection services)
{
try
{
var requestHeader = context.Request.Headers["Authorization"];
var accessToken = requestHeader.Count > 0 ? requestHeader[0].Split(" ")[1] : String.Empty;
var redisService = context.HttpContext.RequestServices.GetRequiredService<IRedisCacheService>()
var blackToken = await redisService.GetCache(TokenHelper.GetRedisKeyForBlackAccessToken(accessToken));
return blackToken == accessToken;
}
catch (Exception ex)
{
Log.Error(ex, $"Failed to validate access token: {ex.Message}");
return true;
}
}
为什么 退出登录 或 修改密码 无法使 token 失效的更多相关文章
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- node+mysql+express实现登录/注册/修改密码/删除用户 接口
实现用户的注册.登录.修改密码.删除用户操作 用到的数据库:nodecms:表:user 目录结构: db目录下存放数据库操作语句: userSQL.js 用户有关的操作语句 router目录 接口路 ...
- 实战!退出登录时如何借助外力使JWT令牌失效?
大家好,我是不才陈某~ 今天这篇文章介绍一下如何在修改密码.修改权限.注销等场景下使JWT失效. 文章的目录如下: 解决方案 JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息, ...
- Mysql 免密码登录,修改密码及忘记密码操作
----免密码登陆 方式一 my.cnf增加[client]标签 [client] user="root" password="你的密码" 单对定义不同的客户端 ...
- 使用手机登录OWA修改密码的问题
最近发现使用手机端登录OWA,安卓手机是可以修改密码的,如图1,但是iPhone就不成,safari和第三方都不可以,如图二. 图一 图二
- 测试点常用用例设计(登录、修改密码、输入框、上传视频、XSS、URL篡改)
1.无效-视频文件测试点: 视频大小过大 视频大小过小 视频名称过长 视频名称包含特殊字符 视频名称包含中文.中英混合 视频文件格式错误 视频文件重复性上传 2.有效-视频文件测试点: 选择符合要求的 ...
- Web实现数据库链接的登录注册修改密码功能
/** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...
- linux修改密码出现Authentication token manipulation error的解决办法
转自 :http://blog.163.com/junwu_lb/blog/static/1916798920120103647199/ Authentication token manipulati ...
- Email接收验证码,以实现登录/注册/修改密码
要求 1)实现Email形式的注册功能和相应的登录功能:2)实现忘记密码时的密码找回功能:3)存在数据库中的密码不能以明文形式存放,即建议在浏览器端发送请求前,调用js代码对用户的密码做md5加密 分 ...
随机推荐
- 关于在VMware中安装的CentOS7系统中无法安装ntp
一.问题引言 今天在虚拟机中新安装了CentOS7,在使用yum命令时,出现如下如错误: 2.点击图片中链接,即是"2"中的红框,发现该链接竟不可达 3.于是开始找度娘,但并没有发 ...
- Qt音视频开发27-Onvif设备搜索
一.前言 最近业余时间主要研究音视频开发这块,前面的文章写了好多种视频监控内核,一旦将这些内核搞定以后,视频监控的相关功能水到渠成.做视频监控系统,绕不过onvif这玩意,这玩意主要就是为了统一一个大 ...
- URL中文转换成类似%E6%96%97%E7%A0%B4(url编码)格式
要将汉字转换成编码格式拼接成请求,没怎么搞过,一番查找,最终确定使用C# 里的WebUtility using System.Net; var a = WebUtility.UrlEncode(&qu ...
- 在CLion中如何为CMakeLists.txt文件添加第三方依赖库
cmake_minimum_required(VERSION 3.5)project(ImageBasedModellingEdu)set(CMAKE_MODULE_PATH "${CMAK ...
- vmstorage如何将原始指标转换为有组织的历史
vmstorage如何将原始指标转换为有组织的历史 参考自:vmstorage-how-it-handles-data-ingestion vmstorage是VictoriaMetrics中负责处理 ...
- Python学习(四)——配套《PyTorch深度学习实战》
1. Python中字符串的相加和相乘 在Python中,字符串可以通过加号(+)进行相加(连接),也可以通过乘号(*)进行相乘(重复).以下是这两种操作的详细说明和示例: 字符串的相加(连接) 字符 ...
- [.NET] 单位转换实践:深入解析 Units.NET
单位转换实践:深入解析 Units.NET 摘要 在现代软件开发中,准确处理不同单位的转换是一个常见而复杂的需求.无论是处理温度.长度.重量还是其他物理量,都需要可靠的单位转换机制.本文将深入介绍 U ...
- C Primer Plus 第6版 第三章 编程练习参考答案
编译环境VS Code+WSL GCC 源码在文末下载 /*第1题*************************/ #include<stdio.h> int main() { int ...
- (七).NET6.0部署RabbitMQ
1.下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 2.Rabbitmq官网下载地址: https://www.rabbitmq.com/d ...
- Diary -「PKUSC 2022」浅谈一类 emo 文学在 OI 游记中的运用
我突然发现这是我第一次完成这样一篇游记-- 一篇记录了绝对意义上"爆炸"的游记. SC 的前几天,我被一些奇怪的理由说服停课.省选已经过去了吧,机房里除了我全是省队.不 ...