using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace Shentun.PeisReport.Api.Jwt
{
    /// 
    /// 
    /// 
    public class JwtHelper
    {
        /// 
        /// 
        /// 
        public JwtHelper()
        {
            
        }
        /// 
        /// 获取JWT令牌
        /// 
        /// 
        /// 
        public string GetJwt(IEnumerable claims)
        {
            var dateTime = DateTime.UtcNow;//世界时间
            //秘钥
            var jwtConfig = new JwtConfig();
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            // 过期时间
            double expMin= jwtConfig.WebExpiration;
         
            DateTime expTime = dateTime.AddMinutes(expMin);
            var jwt = new JwtSecurityToken(
                issuer: jwtConfig.Issuer,//颁发者
                audience: jwtConfig.Audience,//颁发给
                claims: claims, //声明集合
                notBefore: dateTime,//生效时间,这里必须使用世界时间
                expires: expTime,//过期时间,这里必须使用世界时间
                signingCredentials: creds);
            var jwtHandler = new JwtSecurityTokenHandler().WriteToken(jwt);
            return jwtHandler;
        }
 
        /// 
        /// 获取TokenValidationParameters
        /// 
        /// 
        public TokenValidationParameters GetTokenValidationParameters()
        {
            var jwtConfig = new JwtConfig();
            TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
            {
                ValidIssuer = jwtConfig.Issuer,//颁发者
                ValidAudience = jwtConfig.Audience,//颁发给
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SecurityKey)),
                /***********************************TokenValidationParameters的参数默认值***********************************/
                RequireSignedTokens = true,
                // SaveSigninToken = false,
                // ValidateActor = false,
                // 将下面两个参数设置为false,可以不验证Issuer和Audience,但是不建议这样做。
                ValidateAudience = true,//颁发给验证
                ValidateIssuer = true,//颁发者验证
                ValidateIssuerSigningKey = true,
                // 是否要求Token的Claims中必须包含 Expires
                RequireExpirationTime = true,
                // 允许的服务器时间偏移量
                ClockSkew = TimeSpan.FromSeconds(300),
                // 是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比
                ValidateLifetime = true
            };
            return tokenValidationParameters;
        }
       
    }
}