簡體   English   中英

嘗試訪問由 Devise JWT 保護的 API 時“沒有可用的驗證密鑰”

[英]"No verification key available" when attempting to access API secured by Devise JWT

我安裝了 gem devise-jwt 我可以執行登錄請求,並收到一個授權令牌作為回報,但是當我嘗試訪問安全端點時,我收到消息: No verification key available.

blaine@devbox:~/langsite/backend [master] $ curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIwZWNjMmIzNi04ZmZiLTQ2Y2QtYTZkNi1iZGRjZmU4YTQxNmMiLCJzdWIiOiIxIiwic2NwIjoidXNlciIsImF1ZCI6bnVsbCwiaWF0IjoxNjA1ODQ2NjczLCJleHAiOjE2MDU4NzU0NzN9.ZyqvylXeLZbrRM2V2s5qsyHxiGgElng58HwQ8qjOHCU" http://localhost:3001/quiz_sentences.json
{"error":"No verification key available"}

這是我在config/initializers/devise.rb文件中的內容:

config.jwt do |jwt|
    jwt.secret = Rails.application.credentials.secret_key_jwt
    jwt.dispatch_requests = [
        ['POST', %r{^/users/sign_in$}],
        ['GET', %r{^/$}]
    ]
    jwt.request_formats = { user: [:json] }
    jwt.expiration_time = 8.hours.to_i
end

我可以正常登錄並收到授權令牌:

blaine@devbox:~/langsite/backend [master] $ curl -D - -X POST -d "user[email]=brlafreniere@gmail.com&user[password]=blaine" http://localhost:3001/users/sign_in.json
HTTP/1.1 201 Created
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Location: /
Content-Type: application/json; charset=utf-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIwZWNjMmIzNi04ZmZiLTQ2Y2QtYTZkNi1iZGRjZmU4YTQxNmMiLCJzdWIiOiIxIiwic2NwIjoidXNlciIsImF1ZCI6bnVsbCwiaWF0IjoxNjA1ODQ4MDQ2LCJleHAiOjE2MDU4NzY4NDZ9.66Hg_NG3E79-ybC4rJK_XkkSxpLcWHWTlOiw96hyvjg
ETag: W/"cfe36cdecee4080492f63e8c8f0c091b"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: c961fc61-a1b4-49f0-bc16-63f19a0abd22
X-Runtime: 0.279213
Vary: Origin
Transfer-Encoding: chunked

似乎我也公開了 Authorization 標頭:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
        origins '*'
        resource('*',
            headers: :any,
            expose: ["Authorization"],
            methods: :any
        )
    end
end

我的用戶模型:

class User < ApplicationRecord
    include Devise::JWT::RevocationStrategies::JTIMatcher
    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
    devise :database_authenticatable, :registerable, :recoverable,
    :rememberable, :validatable, :jwt_authenticatable, jwt_revocation_strategy: self
end

我很困惑,任何幫助表示贊賞。 謝謝。

TLDR; 確認jwt.secret實際上正在設置

我遇到了同樣的問題,在我的情況下,這是因為在通過systemd啟動 Puma 時jwt.secret沒有被正確讀取。

config.jwt do |jwt|
 jwt.secret = ENV['JWT_SECRET_KEY'] # was blank, only if starting via systemd or other daemon
 jwt.dispatch_requests = [
   ['POST', %r{^/login$}]
 ]
 jwt.revocation_requests = [
   ['DELETE', %r{^/logout$}]
 ]
 jwt.expiration_time = 2.weeks.to_i
end

出於某種原因,在遠程服務器上,通過systemd服務啟動時, env['JWT_SECRET_KEY']為空。 但是,當手動啟動 Puma 時,它運行良好。

我通過硬編碼一個字符串作為秘密發現了這一點。 突然它起作用了。

config.jwt do |jwt|
 jwt.secret = "012345678901234567890123456789" # Suddenly worked
 jwt.dispatch_requests = [
   ['POST', %r{^/login$}]
 ]
 jwt.revocation_requests = [
   ['DELETE', %r{^/logout$}]
 ]
 jwt.expiration_time = 2.weeks.to_i
end 

如果jwt.secret為空,它仍然會出於任何原因生成一個auth token 像你一樣,這讓我失望,因為它讓我認為我的設置是正確的。


要測試您是否遇到類似問題,請暫時將亂碼硬編碼為秘密。 如果那行得通,那么你就在正確的軌道上

顯然,您不應該對字符串進行硬編碼,而應該查看並確認您的密碼是否正確輸入到上述配置中。

對我來說,這意味着在systemd服務配置中指定一個EnvironmentFile ,其中包含key=value對(很像dotenv文件)。

這個問題符合我的問題,但讓我對這個問題給出了不同的答案: ruby on rails: heroku: Missing `secret_key_base` for 'production' environment

對於其他遇到此問題的人 - 檢查您是否使用 Rails.application.secret_key_base(而不是 Rails.application.secrets.secret_key_base)

暫無
暫無

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

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