我正在尝试像这样设置jwt令牌的过期时间:
但是,当我尝试访问URL时,令牌始终有效。并且如果我解码令牌,我从哈希中永远不会得到exp键值对。有什么建议吗?
更新
我正在使用jwt gem。
这就是我如何验证用户身份的。
class JsonWebToken
def self.encode(payload)
payload[:exp] = (2).minutes.from_now.to_i #expire in 2 minutes
JWT.encode(payload, Rails.application.secrets.secret_key_base)
end
def self.decode(token)
return HashWithIndifferentAccess.new(JWT.decode(token, Rails.application.secrets.secret_key_base)[0])
rescue
nil
end
end
但是,当我尝试访问URL时,令牌始终有效。并且如果我解码令牌,我从哈希中永远不会得到exp键值对。有什么建议吗?
更新
我正在使用jwt gem。
这就是我如何验证用户身份的。
def authenticate_user
user = User.find_for_database_authentication(email: params[:email])
if user.valid_password?(params[:password])
render json: payload(user)
else
render json: {errors: ['Invalid Username/Password']}, status: :unauthorized
end
end
private
def payload(user)
return nil unless user and user.id
{
auth_token: JsonWebToken.encode({user_id: user.id}),
user: {id: user.id, email: user.email}
}
end
使用curl的示例:
curl -X POST -d email="a@a.com" -d password="changeme" http://localhost:3000/auth_user
这个curl返回:
{"auth_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.wPPX7T6WJ5K8ucjZF_l8-9mG7IzabcusLeWw1UOhhTM","user":{"id":1,"email":"a@a.com"}}
然后在我的 Rails 控制台上:
JWT.decode("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.wPPX7T6WJ5K8ucjZF_l8-9mG7IzabcusLeWw1UOhhTM", Rails.application.secrets.secret_key_base)
并获取:
[{"user_id"=>1}, {"typ"=>"JWT", "alg"=>"HS256"}]
正如您所看到的,令牌始终有效,即使我在这一行设置了过期时间:
def self.encode(payload)
payload[:exp] = (2).minutes.from_now.to_i #expire in 2 minutes <<--- This one
JWT.encode(payload, Rails.application.secrets.secret_key_base)
end
Authorization
头部,(可能)解码了 JWT 并且应该拒绝带有无效令牌的请求,但是我在你分享的代码中没有看到任何类似的内容。我只能说 JWT gem 似乎没有问题,所以你代码中的问题出现在其他地方。 - user94559