我已经使用 C# 在我的 web api 中创建了一个这样的 token 。
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;
}
当我为 reactjs 应用程序使用该 API 时,我得到了 token ,但无法使用相同的 key 验证它。 我收到错误无效签名。 我正在使用 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
中的 token 是否仍然有效以保持用户登录。
感谢任何帮助。
最佳答案
我找到了解决方案。不能只是将 secretKey
推送到 jwt.verify(token,secretKey);
这不起作用,因为某些 base64 编码/解码
算法。我要做的是首先从我的 secret 中创建一个缓冲区,例如:
const secret = new Buffer("myTokeSecretString", "base64");
然后将该 secret
传递给 verify
方法,它就可以工作了。
关于javascript - 使用 System.IdentityModel.Tokens.Jwt 验证在 C# 中生成的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48907726/