ruby-on-rails – Rails:路由前进行身份验证

ruby-on-rails – Rails:路由前进行身份验证,第1张

概述什么. 我正在尝试在我的Rails API上实现基于令牌的基本身份验证.它适用于现有路线,但这里有一个问题: 当未经身份验证的用户访问不存在的路由时,它会显示404 – 未找到页面,而不是401 – 未授权.在验证路由之前,如何让Rails检查身份验证? 这是我的application_controller.rb: class Api::V1::ApiController < Applicatio 什么.

我正在尝试在我的Rails API上实现基于令牌的基本身份验证.它适用于现有路线,但这里有一个问题:

当未经身份验证的用户访问不存在的路由时,它会显示404 – 未找到页面,而不是401 – 未授权.在验证路由之前,如何让Rails检查身份验证?

这是我的application_controller.rb:

class API::V1::APIController < ApplicationController  # Main controller inherited by all API controllers  # For APIs,you may want to use :null_session instead.  protect_from_forgery with: :null_session  # Enforce site-wIDe authentication  before_action :authenticate  def authenticate    authenticate_token || render_unauthorized  end  def authenticate_token    # Can we find a user with the authentication token used?    authenticate_with_http_basic do |u,p|      # Only search active,private keys      @API_key = APIKey.active.find_by(API_key: u,is_secret: true)      @user = @API_key.user if @API_key      return @API_key    end  end  def render_unauthorized    # displays the Unauthorized message    render Json: JsON.pretty_generate({       error: {         type: "unauthorized",message: "This page cannot be accessed without a valID API key."        }       }),status: 401  endend

为什么

可以这样想:有人阻止你在办公室询问方向.你是否要求他们首先提供一些身份z或你是否只是向他们展示?

如果它是一个公职,我只是向他们展示道路……但如果我们在中央情报局受限制的特殊项目部门,我不在乎你要去哪里(特别是如果你告诉我你的话)重新寻找Office 404,我知道它不存在):我想先看一些ID.

编辑:使用基本身份验证

我最初提到了基于令牌的身份验证,但它实际上是Basic Auth(带有“username”=“token”).

解决方法 使用内置的rails认证你无法实现你想要的,因为@ rich-peck解释道. Rails首先评估您的路由,然后传递控制器的请求.

你有两个选择.首先,做一下Stripe的人正在做的事情.将身份验证委派给应用服务器前面的Web服务器(在其情况下为Nginx).

$curl -I https://API.stripe.com/this/route/doesnt/existhttp/1.1 401 UnauthorizedServer: NginxDate: Fri,08 Aug 2014 21:21:49 GMTContent-Type: application/Json;charset=utf-8Www-Authenticate: Basic realm="Stripe"Cache-Control: no-cache,no-storeStripe-Version: 2014-08-04Strict-Transport-Security: max-age=31556926; includeSubDomains

或者,如果您希望/需要将其保存在ruby-land中,您可以使用机架中间件,在rails加载您的路线之前进行身份验证.你可以尝试https://github.com/iain/rack-token_auth

$bin/rake mIDdleware...snip a bunch of mIDdleware...use Rack::TokenAuthrun Dummy::App::Application.routes

更新:使用http基本身份验证

在这种情况下,您根本不需要另一个库,因为Rack通过Rack :: Auth :: Basic中间件内置了对http basic auth的支持,例如:

config.mIDdleware.use Rack::Auth::Basic do |username,password|  username == "bob" && password == "secret"end

更新:我可以将身份验证应用于API命名空间吗?

这取决于.由于机架中间件在rails加载路由,控制器等之前运行,因此它不知道您的命名空间.尽管如此,如果您的命名空间控制器也在URL级别进行了命名空间,例如在/ API下,您可以检查request.path是否应用身份验证.

您可以使用此行为创建一个新的机架mIDdlware来装饰Rack :: Auth :: Basic,例如:

class MyAPIAuth < Rack::Auth::Basic  def call(env)    request = Rack::Request.new(env)    if request.path =~ /\A\/API\/?/      super    else      @app.call(env)    end  endend# change your configuration to use your mIDdlewareconfig.mIDdleware.use MyAPIAuth do |username,password|  username == "bob" && password == "secret"end
总结

以上是内存溢出为你收集整理的ruby-on-rails – Rails:路由前进行身份验证全部内容,希望文章能够帮你解决ruby-on-rails – Rails:路由前进行身份验证所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存