web-dev-qa-db-fra.com

Faire une authentification de base HTTP dans des rails

Bonjour, je viens de Grails et je connais bien Rails. Je souhaite effectuer une authentification http de base dans Rails.

J'ai un code dans Grails qui fait l'authentification de base comme ceci:

def authString = "${key}:".getBytes().encodeBase64().toString()
def conn = "http://something.net".toURL().openConnection()
conn.setRequestProperty("Authorization", "Basic ${authString}")

Est-ce la même chose peut être fait avec des rails?

Merci d'avance.

27
sriram

Écrivez le code ci-dessous dans le contrôleur que vous souhaitez limiter à l'aide de l'authentification de base http

http_basic_authenticate_with :name => "user", :password => "password" 
74
Nishant

Dans Ruby on Rails 4, vous pouvez facilement appliquer une authentification HTTP de base à l’ensemble du site ou par contrôleur, selon le contexte.

Par exemple, si vous avez besoin d'une authentification à l'échelle du site:

class ApplicationController < ActionController::Base
  http_basic_authenticate_with name: "admin", password: "hunter2"
end

Ou par contrôleur:

class CarsController < ApplicationController
  http_basic_authenticate_with name: "admin", password: "hunter2"
end
15
sergserg

J'ai voté la réponse de @ Nishant, mais je voulais ajouter une autre friandise. Vous pouvez toujours définir des filtres pour qu'il ne s'applique qu'à certaines actions du contrôleur en transmettant only ou except comme suit:

http_basic_authenticate_with name: "admin", password: "strongpasswordhere", only: [:admin, :new, :edit, :destroy]

ou 

http_basic_authenticate_with name: "admin", password: "strongpasswordhere", except: [:show]

Très utile dans de nombreux cas.

9
Kyle Carlson
# app/controllers/application_controller.rb
  before_filter :http_basic_auth

  def http_basic_auth
    if ENV['HTTP_AUTH'] =~ %r{(.+)\:(.+)}
      unless authenticate_with_http_basic { |user, password|  user == $1 && password == $2 }
        request_http_basic_authentication
      end
    end
  end

et il vous suffit ensuite d'exporter votre variable d'environnement avec l'utilisateur: mot de passe par exemple

   export HTTP_AUTH=user:pass

si vous utilisez heroku.com:

   heroku config:set HTTP_AUTH=user:pass
6
heriberto perez

Lors de la connexion à des points de terminaison HTTP protégés par une authentification HTTP de base, j'utilise généralement HTTParty . HTTParty est un wrapper simple pour les classes inférieures Ruby STD comme net/http .

Exemple d'utilisation de HTTParty avec l'authentification de base.

class Delicious
  include HTTParty
  base_uri 'https://api.del.icio.us/v1'

  def initialize(u, p)
    @auth = {username: u, password: p}
  end

  def recent options={}
    options.merge!({basic_auth: @auth})
    self.class.get('/posts/recent', options)
  end
end

delicious = Delicious.new("<username>", "<password>")

pp delicious.recent #=> list of recent elements

Recherchez d'autres exemples sur GitHub .

1
Oto Brglez

Pour la dernière version de Rails, il existe une ASCIIcast qui explique en plusieurs étapes l'authentification de base HTTP.

Le lien va ici

Côté Remarque: Soyez averti que l'authentification de base HTTP transmet le nom d'utilisateur et le mot de passe en texte clair. Vous ne devez donc pas utiliser cette méthode pour les applications nécessitant un niveau de sécurité supérieur. 

0
My God

Il y a un grand casting de rails sur ce sujet

http://railscasts.com/episodes/82-http-basic-authentication

0
Kansha