Я придумал следующий код:
Код: Выделить всё
using System.Security.Claims;
using System.Text;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
namespace LiveKitToken
{
[Serializable]
class VideoClaim
{
public string room { get; set; }
public bool roomCreate { get; set; }
public bool roomJoin { get; set; }
}
internal class TokenGenerator
{
public string CreateToken(string apiKey, string apiSecret, string roomName, string identity, TimeSpan validFor)
{
var now = DateTime.UtcNow;
VideoClaim videoClaim = new VideoClaim()
{
room = roomName,
roomCreate = true,
roomJoin = true
};
var claims = new Claim[]
{
new Claim(JwtRegisteredClaimNames.Iss, apiKey),
new Claim(JwtRegisteredClaimNames.Sub, identity),
new Claim(JwtRegisteredClaimNames.Nbf, new DateTimeOffset(now).ToUnixTimeSeconds().ToString()),
new Claim(JwtRegisteredClaimNames.Exp, new DateTimeOffset(now.Add(validFor)).ToUnixTimeSeconds().ToString()),
new Claim("video", JsonConvert.SerializeObject(videoClaim, Formatting.Indented))
};
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(apiSecret));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
claims: claims,
signingCredentials: credentials
);
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.WriteToken(token);
}
}
}
Когда я декодирую действительный токен, я вижу это:

На предыдущем изображении мы видим, что утверждение видео является объектом, но для моего кода я получаю следующее:

В этом случае заявка на видео всегда включается в виде строки, более того, конструктор Claim в C# не предлагает какого-либо типа для добавления объекта среди различных поддерживаемых им типов.
Думаю, именно это и вызывает мой Токен недействителен, но мне не удалось создать токен, идентичный действительному.
Любая помощь заранее приветствуется!
Подробнее здесь: https://stackoverflow.com/questions/774 ... in-c-sharp
Мобильная версия