using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using Nirvana.Common;
using Nirvana.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YBDevice.Entity;
namespace YBDevice.NApi.DBServices
{
///
/// 接口权限管理
///
public partial class BaseApp : Repository
{
public static int ExpiresMin = 60 * 24 * 7;//60*24*1 登录过期时间,单位为分钟
public static WebApiOperaModel authInfo = null;
public static string secureKey = Configs.GetString("SecureKey");
public string CDNURL = Configs.GetString("CDNURL");//CDN地址
public string APICDNURL = Configs.GetString("APICDNURL");//API图片CDN地址
///
/// 生成token
///
///
///
public static string Token(WebApiOperaModel model)
{
//生成token,SecureKey是用于加密token的key
byte[] key = Encoding.Default.GetBytes(secureKey);
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
model.expiretime = DateTime.Now.AddMinutes(ExpiresMin);
model.gid = Guid.NewGuid().ToString("N");
//保存gid到redis
//RedisHelpers.Insert($"sc_{model.userid}", model.gid);
var token = encoder.Encode(model, key);
return token;
}
///
/// token解密
///
///
/// 接口访问ip
///
public static bool DecodeToken(string token, string ip)
{
if (string.IsNullOrEmpty(token))
{
return false;
}
IJsonSerializer serializer = new JsonNetSerializer();
var provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); // symmetric
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
var tokens = decoder.Decode(token, secureKey, verify: true);
if (string.IsNullOrEmpty(tokens))
{
return false;
}
var info = tokens.ToObject();
//检查时间是否已经过期
if (DateTime.Now > info.expiretime)
{
return false;
}
//检查用户ID是否存在
if (info.UserId <= 0)
{
return false;
}
//if (RedisHelpers.stringGet($"sc_{ info.userid}") != info.gid)
//{
// return false;
//}
//检查访问的ip是否为token里的ip
//if (ip != info.loginip)
//{
// return false;
//}
info.expiretime = DateTime.Now.AddMinutes(ExpiresMin);
authInfo = info;
return true;
}
}
}