ドットネットコア2.0 Web APIのトークンを取得しようとしています。
これは私がやっていることです:
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 '"'
すでにWebを検索しましたが、有効なソリューションが見つかりませんでした。
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; }
}
}
}
このエラーは、コントローラーとは関係ありませんが、Curl呼び出し自体とは関係ないと思います。
(スタックオーバーフローはコードが多すぎると考えているため、テキストを追加する必要があります。したがって、ここでいくつかの素晴らしいLorem Ipsumがあります。) voluptua。 vero eos et accusam et justo duo dolores et ea rebum。クリタ・カスド・グベルグレン、シータキマタ・サンクトゥス・エスト・ロレム・イプサム・ドロア・シット・アメットをステット。座って、サディプスエリートを設定し、sed diam nonumy eirmod tempor invidunt ut Labore et dolore magna aliquyam erat、sed diam voluptua。 vero eos et accusam et justo duo dolores et ea rebum。クリタ・カスド・グベルグレン、シータキマタ・サンクトゥス・エスト・ロレム・イプサム・ドロア・シット・アメットをステット。
私は似たような何かに出くわし、いくつかの特殊文字の一重引用符と二重引用符にだまされました。そのため、ここでアドバイスするように、コマンドラインでcurlリクエストを正しくフォーマットしたことを確認してください。単一引用符内の二重引用符に固執する場合、エスケープする必要はありません。
これを試してください:
curl -X POST -H 'Content-Type:application/json' http://localhost:56183/api/token -d '{"username":"mario", "password":"secret"}'