无法使用 JWT 身份验证在 rails 后端创建用户对象



我正在尝试使用JWT身份验证在rails PostgreSQL数据库中创建用户对象。当我从 React 前端触发创建用户方法时,用户不是在后端创建的,我怀疑这与我的控制器的设置方式有关。

这是我的 Rails 后端中的用户控制器:

class Api::V1::UsersController < ApplicationController
before_action :find_user, only: [:show]
skip_before_action :authorized, only: [:index, :create]
def index
@users = User.all
render json: @users
end
def show
render json: @user
end
def create
@user = User.create(user_params)
if @user.valid?
@token = encode_token(user_id: @user.id)
render json: { user: UserSerializer.new(@user), jwt: @token }, status: :created
else
render json: {error: "Could not create user"}, status: :unprocessible_entity
end
end
end
private
def user_params
params.permit(:username, :password)
end
def find_user
@user = User.find(params[:id])
end

这是我的 JWT "身份验证"控制器:

class Api::V1::AuthController < ApplicationController
skip_before_action :authorized, only: [:create]
def create # POST /api/v1/login
@user = User.find_by(username: user_login_params[:username])
if @user && @user.authenticate(user_login_params[:password])
@token = encode_token({ user_id: @user.id })
render json: { user: UserSerializer.new(@user), jwt: @token }, status: :accepted
else
render json: { message: 'Invalid username or password' }, status: :unauthorized
end
end
private
def user_login_params
params.require(:user).permit(:username, :password)
end
end

还有我的应用程序控制器(我怀疑问题就在这里,与我编码和解码令牌的方式有关(:

class ApplicationController < ActionController::API
before_action :authorized
def encode_token(payload) 
JWT.encode(payload, ENV["jwt_secret"]) 
end
def auth_header
request.headers['Authorization']
end
def decoded_token
if auth_header()
token = auth_header.split(' ')[1] 
begin
JWT.decode(token, ENV["jwt_secret"], true, algorithm: 'HS256')
rescue JWT::DecodeError
nil
end
end
end
def current_user
if decoded_token()
user_id = decoded_token[0]['user_id'] 
@user = User.find_by(id: user_id)
else
nil
end
end
def logged_in?
!!current_user
end
def authorized
render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
end
end

从我的前端,我正在使用一种获取方法来 POST 到/users/端点,如下所示:

export const signupUser = (username, password) => {
return(dispatch) => {
const data = {user: {username, password} }
fetch('http://localhost:3000/api/v1/users',{
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json'
},
body: JSON.stringify(data)
})
.then(r=>r.json())
.then(r=>{
localStorage.setItem('jwt', r.jwt)
dispatch({
type: SET_CURRENT_USER,
payload: r.user
})
})
}
}

抱歉,这是啰嗦的。我想包含解决这个问题所需的所有代码。任何协助将不胜感激。

我注意到您在使用函数创建用户时没有保存用户对象。请检查app/controllers/api/v1/users_controller.rb并使用valid修改以下内容save方法

def create
@user = User.create(user_params)
if @user.valid?
@token = encode_token(user_id: @user.id)
render json: { user: UserSerializer.new(@user), jwt: @token }, status: :created
else
render json: {error: "Could not create user"}, status: :unprocessible_entity
end
end

将行@user.valid?更改为@user.save

def create
@user = User.create(user_params)
if @user.save
@token = encode_token(user_id: @user.id)
render json: { user: UserSerializer.new(@user), jwt: @token }, status: :created
else
render json: {error: "Could not create user"}, status: :unprocessible_entity
end
end

请注意.valid?用于验证和检查是否有任何错误,.save用于保存它。您只是检查验证而不是实际保存,验证会自动发生,因此此处不需要此方法。

最新更新