簡體   English   中英

如何在rails api上重置密碼? [不使用設備]

[英]How to reset password on rails api? [Not using devise]

所以我正在嘗試為我的 rails api 修正一個恢復密碼機制,但我遇到了麻煩。

在做了一些研究之后,我想出了一個實現它的方法。 它返回像它一樣工作的值,但密碼沒有被重置,我不知道為什么。

我的用戶表如下所示:

create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "middle_name"
    t.string "last_name"
    t.string "username"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
  end

我重置密碼的方式是:從控制器:

...
def reset
        token = params[:token].to_s

        if params[:email].blank?
            return render json: {error: 'Token not present.'}
        end

        user = User.find_by(reset_password_token: token)

        if user.present? && user.password_token_valid?
            if user.reset_password!(params[:password])
                render json: {status: 'ok'}, status: :ok
            else
                render json: {error: user.errors.full_messages}, status: :unprocessable_entity
            end
        else
            render json: {error: 'Link not valid or expired.'}, status: :not_found
        end
    end
...

然后模型:

...

 def password_token_valid?
        (self.reset_password_sent_at + 4.hours) > Time.now.utc
    end

    def reset_password!(password)
        self.reset_password_token = nil
        self.password = password
    end
...

這是實現這一點的正確方法嗎? 這是最安全的實現方式嗎?

注意:我只在生產中測試過,這是由於我的開發環境限制發送電子郵件。

您只是更新內存中的值,而永遠不會將它們持久化到數據庫中。

def reset_password!(password)
  update!(
    password: password,
    reset_password_token: nil
  )
end

這是最安全的實現方式嗎?

不。重新發明身份驗證輪是應用程序被黑客入侵的最常見原因之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM