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.
É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"
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
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.
# 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
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 .
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.
Il y a un grand casting de rails sur ce sujet