Для входа в систему используются токены Devise? - PullRequest
38 голосов
/ 07 января 2011

Итак, я пытаюсь использовать токены с Devise (версия 1.0.3 с Rails 2.3.8), чтобы позволить пользователю войти в систему, но я не совсем уверен, с чего начать.

http://zyphdesignco.com/blog/simple-auth-token-example-with-devise

Приведенный выше учебник помог мне включить функциональность токенов и показал, как генерировать (или удалять) токены ... но весь ТОЧКА токенов состоит в том, чтобы использовать их для авторизации пользователя, верно?

Когда я смотрю на пользователя в консоли, я могу сказать user.authentication_token и получить что-то вроде: "Qm1ne93n_XkgmQTvxDmm", что все хорошо, но куда мне идти?

Я попытался войти в корень sign_in с помощью следующей команды командной строки:

curl -d "authentication_token = Qm1ne93n_XkgmQTvxDmm" localhost: 3000 / users / sign_in

И определенно не удалось войти в систему.

В контроллере сессий я вижу, что они вызывают:

authenticate (resource_name)

Я предполагаю, что это где-то в модуле:

включает Devise :: Controllers :: InternalHelpers

, который включается, но я не знаю, где это искать (его точно нет в папке контроллера исходного кода).Если бы я мог взглянуть на то, как работает аутентификация, я бы увидел, смотрит ли она даже на токены ...

Позволяет ли Devise входить в систему с токенами, или у него просто есть структура для их генерации?Если это позволяет вам войти с ними ... КАК вы это делаете?Разве вы не можете использовать curl (то есть должен ли он быть в браузере? Если это так, я должен был бы найти свое собственное решение, мне НУЖНА поддержка без браузера.).Если это не так, как я могу бросить свой собственный?

Ответы [ 3 ]

36 голосов
/ 12 января 2011

Насколько я понимаю, вы можете использовать токены для входа в систему или попадания на произвольные страницы, требующие аутентификации, даже с помощью cURL. Если вы посмотрите в config/initializers/devise.rb, там должна быть строка, которая говорит что-то вроде:

config.token_authentication_key = :auth_token

Каким бы ни было имя token_authentication_key, оно должно совпадать с тем, что вы указали в качестве параметра запроса или формы в своем запросе. В вашем примере вы использовали authentication_token, но не уверены, изменили ли вы devise.rb, чтобы соответствовать этому или нет.

Если вы хотите выяснить, как все работает внутри, я бы попробовал git clone git://github.com/plataformatec/devise.git и поиска методов, которые вам нужно уточнить.

Вот несколько примеров запросов cURL (я сделал пользовательский Users :: SessionsController, который расширяет Devise :: SessionsController и переопределяет метод create для обработки JSON.)

class Users::SessionsController < Devise::SessionsController
  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)

    respond_to do |format|
      format.html do
        respond_with resource, :location => redirect_location(resource_name, resource)
      end
      format.json do
        render :json => { :response => 'ok', :auth_token => current_user.authentication_token }.to_json, :status => :ok
      end
    end
  end
end 

А затем запросы cURL, которые я дал:

curl -X POST 'http://localhost:3000/users/sign_in.json' -d 'user[email]=example@example.com&user[password]=password'
-> {"response":"ok","auth_token":"ABCDE0123456789"}

curl -L 'http://localhost:3000/profile?auth_token=ABCDE0123456789'
-> got page that I wanted that needs authentication
5 голосов
/ 12 января 2011

см. Эту статью: http://www.hyperionreactor.net/blog/token-based-authentication-rails-3-and-rails-2

По сути, все, что вам нужно, это добавить токен к вашим запросам, и вы автоматически аутентифицируетесь, т.е. локальный: 3000 / posts.xml auth_token = the_token

2 голосов
/ 28 октября 2016

Это была хорошая отправная точка для меня:

Миграция для добавления authentication_token:

class AddTokenBasedAuthentication < ActiveRecord::Migration
  def change
    add_column :users, :authentication_token, :string
    add_index :users, :authentication_token, unique: true
  end
end

А затем в контроллере приложения:

class ApplicationController < ActionController::Base
  before_filter :authenticate_user_from_token!
  before_action :authenticate_user!, except: <your login GET action>

  private 

  def authenticate_user_from_token!
    email = params[:email].presence
    user  = email && User.find_by(email: email)

    sign_in user if user && Devise.secure_compare(user.authentication_token, params[:auth_token])
  end
end

И тогда конструкция ссылки - это просто

www.yoursite.com/?email=the@email.address&auth_token=whatever_auth_token_is_stored_for_that_user

источники: эта суть связана с вики devise , & с этим учебником (упомянутым выше))

...