解析token中的信息 ,比如token中的userid

Posted 追梦少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析token中的信息 ,比如token中的userid相关的知识,希望对你有一定的参考价值。

介绍

某些情况我们需要解析token中的信息,比如token中的用户id,方便我们后面用于查询。
上一篇 我们讲了如何生成token,登录鉴权,怎么验证接口权限的。接下来我们讲讲如何获取token中的信息

基本思路:

在过滤器中将token中的用户信息存放到context.HttpContext.User或者Thread.CurrentPrincipal中。使用时通过扩展方法或者静态方法获取用户信息。
本篇将演示通过context.HttpContext.User存放用户信息

新建过滤器TokenActionFilter,代码如下:

public class TokenActionFilter : ActionFilterAttribute

    public override void OnActionExecuting(ActionExecutingContext context)
    
        var test = context.HttpContext.Request.Path;
        string bearer = context.HttpContext.Request.Headers["Authorization"].FirstOrDefault();
        if (string.IsNullOrEmpty(bearer) || !bearer.Contains("Bearer")) return;
        string[] jwt = bearer.Split(\' \');
        var tokenObj = new JwtSecurityToken(jwt[1]);

        var claimsIdentity = new ClaimsIdentity(tokenObj.Claims);
        var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
        context.HttpContext.User = claimsPrincipal;
    

添加扩展方法GetUserId,代码如下:

public static class TokenHelper

    public static int GetUserId(this ClaimsPrincipal claimsPrincipal)
    
        try
        
            var claim = claimsPrincipal?.Claims.FirstOrDefault(c => c.Type == "UserId");
            if (claim == null || string.IsNullOrEmpty(claim.Value))
            
                return 0;
            

            return int.Parse(claim.Value);
        
        catch
        
            return 0;
        
    

然后就是获取用户id的方法:

[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase

    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserController (IHttpContextAccessor httpContextAccessor)
    
        _httpContextAccessor = httpContextAccessor;
    


    /// <summary>
    /// 获取UserId
    /// </summary>
    /// <returns></returns>
    [HttpGet("GetUser")]
    [TokenActionFilter]
    [Authorize(AuthenticationSchemes = "Bearer")]
    [Authorize(Roles = "Admin")]
    public int GetUser()
    
        var id = _httpContextAccessor.HttpContext.User.GetUserId();
        return id;
    

此处需要注入IHttpContextAccessor 服务,通过IHttpContextAccessor 获取用户信息。

最后还需要在Startup,注册IHttpContextAccessor 服务和TokenActionFilter过滤器

public void ConfigureServices(IServiceCollection services)

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddScoped<TokenActionFilter>();

    // 其他服务

注意:

一定要记得在Startup中注册IHttpContextAccessor

如果需要获取用户其他信息,可以自行扩展。

app使用微信h5页面,获取url中的token并使用

参考技术A app中部分页面要使用微信h5页面,其中一些servise请求需要自定义token

一开始想在ouath2.js里修改openid设置的,但是后来采用的其他的办法。
openidCache.set() 是存储用户信息的方法

先获取url,进行解析,看query中是否存在token
只有没有获取到用户信息且query中没有token,才进入登陆页面oauth2.js

如果query中有token,就重新请求接口,获取用户信息并缓存。

优先获取query中的token,其次获取缓存中的token

以上是关于解析token中的信息 ,比如token中的userid的主要内容,如果未能解决你的问题,请参考以下文章

JWT如何解析过期的token中的信息

app使用微信h5页面,获取url中的token并使用

HandlerMethodArgumentResolver方法参数解析器的使用

spring security 的jwt认证以及原理解析

spring security 的jwt认证以及原理解析

thriftpy+ply源码分析