我在使用C#的web api中创建了这样的令牌。
private const string Secret = "someSecretKey";
public static string GenerateToken(AuthModel user, int expireMinutes = 20)
{
var symmetricKey = Convert.FromBase64String(Secret);
var tokenHandler = new JwtSecurityTokenHandler();
var now = DateTime.UtcNow;
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.Role, ((Roles)user.RoleId).ToString()),
new Claim("guid",user.Guid)
}),
Expires = now.AddMinutes(Convert.ToInt32(expireMinutes)),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(symmetricKey), SecurityAlgorithms.HmacSha256Signature)
};
var stoken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(stoken);
return token;
}
当我使用反应应用程序的API时,我获得令牌,但无法使用相同的密钥验证它。 我得到错误INVALID SIGNATURE。 我正在使用jsonwebtoken npm包,
import jwt from 'jsonwebtoken';
jwt.verify(token, keys.jwtSecret, async (err) => {
if (err) {
//console.log('Token expired at: ', err.expiredAt)
console.log("error", err)
}
else {
dispatch(login(token));
}
});
我从来没有击中dispatch(login(token))
。我正在使用它来检查localStorage
中保存的令牌是否仍然有效以保持用户登录。
感谢任何帮助。
答案 0 :(得分:1)
我找到了解决方案。无法在secretKey
jwt.verify(token,secretKey);
中推送base64 encoding/decoding
因为某些const secret = new Buffer("myTokeSecretString", "base64");
算法而无法正常工作。我必须做的是首先从我的秘密中制作缓冲区,如:
secret
然后将verify
传递给user song
A 11
A 22
B 22
B 33
C 11
D 44
C 33
E 11
D 33
方法并且它可以正常工作。