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.UseJmsTokenAuthentication("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示例列表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM