Ruby on Rails 5.2 - ActionController::HttpAuthentication::Token

मॉड्यूल एक्शनकंट्रोलर :: HttpAuthentication :: टोकन




ruby

मॉड्यूल एक्शनकंट्रोलर :: HttpAuthentication :: टोकन

HTTP Token प्रमाणीकरण करना आसान बनाता है।

सरल Token उदाहरण:

class PostsController < ApplicationController
  TOKEN = "secret"

  before_action :authenticate, except: [ :index ]

  def index
    render plain: "Everyone can see me!"
  end

  def edit
    render plain: "I'm only accessible if you know the password"
  end

  private
    def authenticate
      authenticate_or_request_with_http_token do |token, options|
        # Compare the tokens in a time-constant manner, to mitigate
        # timing attacks.
        ActiveSupport::SecurityUtils.secure_compare(token, TOKEN)
      end
    end
end

यहां एक अधिक उन्नत Token उदाहरण है जहां केवल एटम फ़ीड और XML API HTTP टोकन प्रमाणीकरण द्वारा सुरक्षित है, नियमित HTML इंटरफ़ेस एक सत्र दृष्टिकोण द्वारा संरक्षित है:

class ApplicationController < ActionController::Base
  before_action :set_account, :authenticate

  private
    def set_account
      @account = Account.find_by(url_name: request.subdomains.first)
    end

    def authenticate
      case request.format
      when Mime[:xml], Mime[:atom]
        if user = authenticate_with_http_token { |t, o| @account.users.authenticate(t, o) }
          @current_user = user
        else
          request_http_token_authentication
        end
      else
        if session_authenticated?
          @current_user = @account.users.find(session[:authenticated][:user_id])
        else
          redirect_to(login_url) and return false
        end
      end
    end
end

अपने एकीकरण परीक्षणों में, आप ऐसा कुछ कर सकते हैं:

def test_access_granted_from_xml
  get(
    "/notes/1.xml", nil,
    'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Token.encode_credentials(users(:dhh).token)
  )

  assert_equal 200, status
end

साझा किए गए मेजबानों पर, अपाचे कभी-कभी एफसीजीआई उदाहरणों के लिए प्रमाणीकरण हेडर पास नहीं करता है। यदि आपका वातावरण इस विवरण से मेल खाता है और आप प्रमाणित नहीं कर सकते हैं, तो अपने Apache सेटअप में इस नियम को आज़माएँ:

RewriteRule ^(.*)$ dispatch.fcgi [E=X-HTTP_AUTHORIZATION:%{HTTP:Authorization},QSA,L]

स्थिरांक

AUTHN_PAIR_DELIMITERS
TOKEN_KEY
TOKEN_REGEX

सार्वजनिक प्रवृत्ति के तरीके

प्रमाणीकृत करें (नियंत्रक, और login_procedure) स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 440
def authenticate(controller, &login_procedure)
  token, options = token_and_options(controller.request)
  unless token.blank?
    login_procedure.call(token, options)
  end
end

यदि टोकन प्राधिकरण शीर्षक मौजूद है, तो लॉगिन प्रक्रिया को वर्तमान टोकन और विकल्पों के साथ कॉल करें।

नियंत्रक

ActionController::Base वर्तमान अनुरोध के लिए ActionController::Base उदाहरण।

login_procedure

अगर टोकन मौजूद है तो कॉल करने के लिए प्रोक। प्रोक को दो तर्क देने चाहिए:

authenticate(controller) { |token, options| ... }

यदि टोकन पाया जाता है तो login_procedure का रिटर्न मान लौटाता है। यदि कोई टोकन नहीं मिलता है, तो रिटर्न देता है।

प्रमाणीकरण_ क्रेक (नियंत्रक, दायरे, संदेश = शून्य) स्रोत दिखाएँ
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 512
def authentication_request(controller, realm, message = nil)
  message ||= "HTTP Token: Access denied.\n"
  controller.headers["WWW-Authenticate"] = %(Token realm="#{realm.tr('"'.freeze, "".freeze)}")
  controller.__send__ :render, plain: message, status: :unauthorized
end

एक डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर सेट करता है ताकि क्लाइंट को पता चल सके कि वह वांछित है।

नियंत्रक - ActionController::Base आउटगोइंग प्रतिक्रिया के लिए ActionController::Base उदाहरण। क्षेत्र - हेडर में उपयोग करने के लिए String क्षेत्र।

कुछ भी नहीं लौटाता।

encode_credentials (टोकन, विकल्प = {}) स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 499
def encode_credentials(token, options = {})
  values = ["#{TOKEN_KEY}#{token.to_s.inspect}"] + options.map do |key, value|
    "#{key}=#{value.to_s.inspect}"
  end
  "Token #{values * ", "}"
end

दिए गए टोकन और विकल्पों को एक प्राधिकरण शीर्ष लेख मूल्य में एन्कोड करता है।

टोकन - String टोकन। विकल्प - विकल्पों के वैकल्पिक Hash

String लौटाता है।

params_array_from (raw_params) स्रोत दिखाएँ
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 471
def params_array_from(raw_params)
  raw_params.map { |param| param.split %r/=(.+)?/ }
end

#raw_params लेता है और इसे मापदंडों की एक सरणी में बदल देता है

raw_params ( ज़ोर ) स्रोत दिखाएँ
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 483
def raw_params(auth)
  _raw_params = auth.sub(TOKEN_REGEX, "").split(/\s*#{AUTHN_PAIR_DELIMITERS}\s*/)

  if !(_raw_params.first =~ %r{\A#{TOKEN_KEY}})
    _raw_params[0] = "#{TOKEN_KEY}#{_raw_params.first}"
  end

  _raw_params
end

यह विधि एक प्राधिकरण निकाय लेती है और मानकीकृत द्वारा कुंजी-मूल्य जोड़े को विभाजित करती है ; , या AUTHN_PAIR_DELIMITERS में परिभाषित \t सीमांकक।

rewrite_param_values (array_params) स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 476
def rewrite_param_values(array_params)
  array_params.each { |param| (param[1] || "".dup).gsub! %r/^"|"$/, "" }
end

यह मान को लपेटने वाले " वर्णों " को निकाल देता है।

token_and_options (अनुरोध) स्रोत दिखाएं
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 458
def token_and_options(request)
  authorization_request = request.authorization.to_s
  if authorization_request[TOKEN_REGEX]
    params = token_params_from authorization_request
    [params.shift[1], Hash[params].with_indifferent_access]
  end
end

टोकन टोकन और विकल्प टोकन प्राधिकरण शीर्षक से बाहर। प्राधिकरण हेडर के लिए मूल्य में उपसर्ग "Token" या "Bearer" होने की उम्मीद है। यदि शीर्ष लेख ऐसा दिखता है:

Authorization: Token token="abc", nonce="def"

फिर लौटा हुआ टोकन "abc" , और विकल्प {nonce: "def"}

अनुरोध - ActionDispatch::Request वर्तमान हेडर के साथ ActionDispatch::Request उदाहरण।

यदि कोई टोकन मौजूद है [String, Hash] तो [String, Hash] की एक Array लौटाता है। यदि कोई टोकन नहीं मिलता है, तो रिटर्न देता है।

token_params_from ( ज़ोर ) स्रोत दिखाएँ
# File actionpack/lib/action_controller/metal/http_authentication.rb, line 466
def token_params_from(auth)
  rewrite_param_values params_array_from raw_params auth
end