Как использовать промежуточное программное обеспечение в рельсах, чтобы получить current_user_id JWT? - PullRequest
1 голос
/ 06 мая 2019

Я новичок в Rails, я обычно в Express использую промежуточное ПО для получения user.id по декодированному JWT, это что-то вроде

/ middleware / jwt.js

const authentic = async (req, res, next) => {
  const token = req.header("token");
  if (!token) {
    res.status(400).json({ error: "no token " });
  } else {
    try {
      const decoded = verifyJwt(token);
      const isAuth = await Person.findOne({ _id: decoded._id });
      if (!isAuth) {
        res.status(400).json({ error: `you are not authentic` });
      } else {
        // keys : _id, role, username
        req.user = decoded;
        next();
      }
    } catch (e) {
      next(e);
    }
  }
};

export default authentic;

затем я использую его на маршрутах, app.use(authentic), чтобы я мог получать req.user.id для каждого запроса, который я связывал или заполнял

в рельсах, как использовать промежуточное ПО и требовал, чтобы подлинное среднее получало current_user_id??так что я мог бы связать это с другими моделями, я использую рельсы только для API, я хотел бы получить некоторую реализацию для этого без каких-либо драгоценных камней, таких как devise или других, просто используя JWT

здесь на рельсахдля JWT:

/ lib / json_web_token.rb

class JsonWebToken
 class << self
   def encode(payload, exp = 24.hours.from_now)
     payload[:exp] = exp.to_i
     JWT.encode(payload, Rails.application.secrets.secret_key_base)
   end

   def decode(token)
     body = JWT.decode(token, Rails.application.secrets.secret_key_base)[0]
     HashWithIndifferentAccess.new body
   rescue
     nil
   end
 end
end

1 Ответ

0 голосов
/ 06 мая 2019

При условии, что выдержка из rails является только маркерным (де-) кодером, реальное промежуточное ПО выглядит очень похоже, это должен быть вызываемый объект (либо proc / lambda, либо, чаще, экземпляр с call методом):

class SomeMiddleware
  def initialize(app, params)
    @app = app
  end

  def call(env)
    @app.call(env)
  end
end
# application.rb
config.middleware.use SomeMiddleware, some_optional: "params"

Но для аутентификации вам не нужно делать это промежуточным ПО, в большинстве случаев before_action в вашем ApplicationController может быть достаточно.

Также вы можете использовать некоторые драгоценные камни, такие как knock или devise-jwt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...