ahmed_sa Ответов: 1

Как сгенерировать токен доступа с помощью jwt ?


Я работаю дальше asp.net ядро 2.2 приложение и мне нужно сгенерировать токен доступа с помощью jwt
я не знаю как генерировать я больше ищу в интернете но не понимаю что это значит
мне нужно на самом деле, когда make success login генерирует токен доступа, но я не знаю, что это за термин и как его генерировать ?
не могли бы вы показать мне какой-нибудь пример кода или объяснить это ?

Что я уже пробовал:

{
"request_status" : {
"status" : "succeeded",
"code": 0,
"message" : "login succeeded!"
},
"access_token" : "",
"user_data": { 
  "UserFullName" : "Ahmed", 
  "LoginTime" : "12", 
  "Admin" : "adil"
  
},
"branches": [
{ 
  "BranchCode" : "1",
  "BranchName":"Baha" 
  
}
]
}

Richard MacCutchan

Я не знаю, что вы искали, но google "access+token+by+using+jwt", который найдет для вас много полезной информации.

1 Ответов

Рейтинг:
2

Harsh.Shah.ifour

Вам нужно реализовать приведенный ниже код в контроллере.

public class LoginController : Controller
    {
        private IConfiguration _config;

        public LoginController(IConfiguration config)
        {
            _config = config;
        }
        
        [AllowAnonymous]
        [HttpPost]
        [Route("Login")]
        public IActionResult Login([FromBody]UserModel login)
        {
            IActionResult response = Unauthorized();
            var user = AuthenticateUser(login);

            if (user != null)
            {
                var tokenString = GenerateJSONWebToken(user);
                response = Ok(new { token = tokenString });
            }
            
            return response;
        }

        private string GenerateJSONWebToken(UserModel userInfo)
        {
            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(_config["Jwt:Issuer"],
              _config["Jwt:Issuer"],
              null,
              expires: DateTime.Now.AddSeconds(500),
              signingCredentials: credentials);

            return new JwtSecurityTokenHandler().WriteToken(token);
        }

        private UserModel AuthenticateUser(UserModel login)
        {
            UserModel user = null;

            //Validate the User Credentials  
            //Demo Purpose, I have Passed HardCoded User Information  
            if (login.Username == "Abc")
            {
                user = new UserModel { Username = "Abc Xyz", Password = "12345" };
            }
            return user;
        }
    }

Вот, у меня есть контроллер входа для этого. Когда пользователь войдет в систему, то вышеописанный метод будет генерировать токен.
Но вам нужно изменить код в вашем файле startup.cs, как показано ниже:

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        { 
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Jwt:Issuer"],
                    ValidAudience = Configuration["Jwt:Issuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
                };
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            
            app.UseAuthentication();
            app.UseHttpsRedirection();
            app.UseMvc();
        }
    }


Теперь создайте еще один контроллер для тестового контроллера входа в систему.
Здесь у меня есть тестовый контроллер:
[Route("api/[controller]")]
   [ApiController]
   public class TestController : ControllerBase
   {
       [HttpGet]
       [Authorize]
       [Route("Get")]
       public ActionResult<IEnumerable<string>> Get()
       {
           return new string[] { "value1", "value2", "value3", "value4", "value5" };
       }
   }

Вы можете видеть, что метод Get() в контроллере тестирования является Authorize. Поэтому, когда пользователь получит доступ к Get() в тестовом контроллере без входа в систему, появится ошибка.

Таким образом, методы в контроллере входа будут генерировать токен, а затем, используя этот сгенерированный токен, пользователь может получить доступ к методу Get (), и данные будут отображаться.

Надеюсь, это вам поможет.