J'essaie d'obtenir un jeton d'une API Web de base net 2.0.
Voici ce que je fais:
C:\Users\danyb>curl -X POST -H 'Content-Type:application/json'^
Mehr? -d '{\"username\":\"mario\",\"password\":\"secret\"}'^
Mehr? localhost:56183/api/token
[1/2]: '"username":"mario"'localhost:56183/api/token --> <stdout>
--_curl_--'"username":"mario"'localhost:56183/api/token
curl: (3) Port number ended with '"'
[2/2]: '"password":"secret"'localhost:56183/api/token --> <stdout>
--_curl_--'"password":"secret"'localhost:56183/api/token
curl: (3) Port number ended with '"'
J'ai déjà effectué des recherches sur le Web, mais je n'ai pas trouvé de solution efficace.
Classe TokenController:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace JWT.Controllers
{
[Route("api/[controller]")]
public class TokenController : Controller
{
private IConfiguration _config;
public TokenController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
[HttpPost]
public IActionResult CreateToken([FromBody]LoginModel login)
{
IActionResult response = Unauthorized();
var user = Authenticate(login);
if (user != null)
{
var tokenString = BuildToken(user);
response = Ok(new { token = tokenString });
}
return response;
}
private string BuildToken(UserModel user)
{
var claims = new[] {
new Claim(JwtRegisteredClaimNames.Sub, user.Name),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(JwtRegisteredClaimNames.Birthdate, user.Birthdate.ToString("yyyy-MM-dd")),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(_config["Jwt:Issuer"],
_config["Jwt:Issuer"],
claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
private UserModel Authenticate(LoginModel login)
{
UserModel user = null;
if (login.Username == "mario" && login.Password == "secret")
{
user = new UserModel { Name = "Mario Rossi", Email = "[email protected]" };
}
return user;
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
private class UserModel
{
public string Name { get; set; }
public string Email { get; set; }
public DateTime Birthdate { get; set; }
}
}
}
Je pense que l'erreur n'a rien à voir avec le contrôleur mais plutôt avec l'appel Curl en tant que tel.
(J'ai besoin d'ajouter plus de texte parce que stack overflow pense que c'est trop de code. Alors voici quelques-uns des plus impressionnants Lorem Ipsum :) voluptua. Duo dolores et ea rebum chez vero eos et accusam et justo Stet clita kasd gubergren, aucun sanctuaire takimata de mer n'est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod invidunt temporaire ut labore et dolore magna aliquyam erat, sed diam voluptua. Duo dolores et ea rebum chez vero eos et accusam et justo Stet clita kasd gubergren, aucun sanctuaire takimata de mer n'est Lorem ipsum dolor sit amet.
J'ai rencontré quelque chose de similaire et j'ai été trompé par des guillemets simples et doubles. Donc, mon conseil ici, assurez-vous que vous avez correctement formaté votre requête curl sur la ligne de commande. Pas besoin de vous échapper si vous vous en tenez à des guillemets doubles dans vos guillemets simples.
Essaye celui-là:
curl -X POST -H 'Content-Type:application/json' http://localhost:56183/api/token -d '{"username":"mario", "password":"secret"}'