Подтвердить что ты не робот

Используя ловушки для входа в систему, встроена ли она?

Итак, я пытаюсь использовать токены с 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

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

ДЕЙСТВУЙТЕ, что вы действительно входите в систему с токенами, или у него есть только фреймворк для их создания? Если это позволит вам войти в систему с ними... КАК вы это делаете? Можете ли вы не использовать завиток (т.е. Он должен быть в браузере? Если это так, я бы бросил свое собственное решение, мне нужна поддержка без браузера.). Если это не так, как мне сделать свой собственный?

4b9b3361

Ответ 1

Я понимаю, что вы можете использовать токены для входа в систему или для удаления произвольных страниц, требующих аутентификации, даже с помощью 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:: SessionController, который расширяет Devise:: SessionController и переопределяет метод 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][email protected]&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

Ответ 3

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

Миграция для добавления 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 protected]&auth_token=whatever_auth_token_is_stored_for_that_user

Источники: этот смысл, связанный с devile wiki, и этот учебник (упомянутый выше)