Я работаю над Rails API, который будет аутентифицироваться с помощью jwt и хотел бы, чтобы учетные записи пользователей могли быть восстановлены.Предположительно, после получения токена сброса по электронной почте, пользователи предоставят свой новый пароль и токен с PUT на https://example.com/users/password
, который будет обрабатываться /app/controllers/users/passwords_controller#update
.В настоящее время я получил это в passwords_controller.rb
(в основном как в коде Devise по умолчанию):
# PUT /resource/password
def update
# {"user": {"password": "secret", "password_confirmation": "secret", "reset_password_token": "token_goes_here"}}
self.resource = resource_class.reset_password_by_token(resource_params) # problem here (line 33)...
yield resource if block_given?
if resource.errors.empty?
resource.unlock_access! if unlockable?(resource)
if Devise.sign_in_after_reset_password
resource.after_database_authentication
auth_options = {user: {login: resource.username, password: params['user']['password']}}
warden.authenticate!(auth_options)
render json: {success: true, jwt: current_token, response: "Authentication successful" }
else
render json: {success: false, response: "Authentication failed" }
end
else
set_minimum_password_length
respond_with resource
end
end
Проблема в том, что reset_password_by_token
запрашивает авторизацию:
app/controllers/users/passwords_controller.rb:33:in `update'
Completed 401 Unauthorized in 220ms (ActiveRecord: 60.8ms | Allocations: 6810)
Мне это кажется странным, так как я ожидаю, что пользователь сможет войти в систему один раз с токеном (если не истек срок действия) для смены пароля.В этот момент я хотел бы вернуть jwt (следовательно, используя warden.authenticate
), чтобы клиентское приложение могло немедленно использовать его для входа пользователя.
Кто-нибудь сможет указать мне вправильное направление здесь?