JMS微服务开发示例(五)生成短token,实现用户无状态登录

用户token,也可以利用第三方框架生成,JMS也包含了自己的token服务器。

 部署TokenServer

这里下载 tokenserver.zip,然后部署运行TokenServer。

 

 

 微服务中编写Login函数

引用 JMS.Token nuget包

代码如下:

  public class MyController : MicroServiceControllerBase
  {
      TokenClient _tokenClient;
      public MyController(TokenClient tokenClient)
      {
        this._tokenClient = tokenClient;
      }

        

     /// <summary> /// 登陆系统 /// </summary> /// <param name="userName">用户名</param> /// <param name="password">密码</param> /// <returns>用户token</returns> public string Login(string userName,string password) { //假设用户登陆成功,id为888 var userid = "888";var token = _tokenClient.Build(userid, DateTime.Now.AddMinutes(15));
return token; } /// <summary> /// 刷新token /// </summary> /// <returns>新的用户token</returns> [JMS.Authorize]
public string RefreshToken()
{

             var token = _tokenClient.Build(this.UserContent, DateTime.Now.AddMinutes(15));

               return token;

        }

//下面代码,可作废token,这样,所有服务器都会不再认同这个token
          //_tokenClient.SetTokenDisable(token);
  }

Program.cs中,启用JMS.Token作为身份验证

 

services.AddJmsTokenAuthentication("192.168.40.132", 9911,"auth");

 服务器端作废token

_tokenClient.SetTokenDisable(token);

 

Controller中,如果所有方法要求身份验证,才能调用,那么,在Controller上加上 [JMS.Authorize] 标识,如果只是某些方法要求身份验证,那么,在方法上加 [JMS.Authorize] 标识

 

 

 

上面代码展示了如何生成一个最短的token,如果你想在token里面放更多的信息,可以使用TokenClient.BuildForString函数生成。不过,有userid和过期时间足矣了,因为token需要每次都放在头部传输,太长只会增加网络流量。

客户端访问微服务时,把token放在header里面

 

            using ( var tran = CreateMST() )
            {
                tran.SetHeader("auth", token);
                .......

 AspNet中使用JMS.Token验证

nuget 引用 JMS.Token.AspNetCore

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddJmsTokenAuthentication("127.0.0.1", 9911);

            services.AddControllers();
         
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            //启用身份验证
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

Controller中获取身份信息:[Authorize]为标准的AspNet [Authorize],不是JMS.Authorize

客户端js请求,加上Authorization头,如:Authorization:your token,注意,不要加

下面代码是服务器端获取token用户信息

        [Authorize]
        [HttpGet]
        public string Test()
        {
            return this.User.FindFirstValue("Content");
        }

 JS端token解码,获取过期时间

    //解码string类型的token
    function decodeJmsStringToken(token) {
        var str = window.atob(token);
        var strArr = JSON.parse(str);
        var obj = JSON.parse(strArr[0]);
        var expireTime = new Date(new Date(1970, 0, 1).getTime() + obj.e * 1000);
        return {
            content: obj.d,
            expireTime: expireTime  //utc时间
        };
    }

    

 

JMS示例列表

posted @ 2020-07-23 10:10  IWing  阅读(894)  评论(0编辑  收藏  举报