Используя ловушки для входа в систему, встроена ли она?
Итак, я пытаюсь использовать токены с 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
который входит в комплект, но я не знаю, где его искать (это определенно не в папке исходного контроллера). Если бы я мог посмотреть, как работает аутентификация, я мог бы видеть, даже ли он СМОТРЕТЬ в токенах...
ДЕЙСТВУЙТЕ, что вы действительно входите в систему с токенами, или у него есть только фреймворк для их создания? Если это позволит вам войти в систему с ними... КАК вы это делаете? Можете ли вы не использовать завиток (т.е. Он должен быть в браузере? Если это так, я бы бросил свое собственное решение, мне нужна поддержка без браузера.). Если это не так, как мне сделать свой собственный?
Ответы
Ответ 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
Ответ 2
см. эту статью: http://www.hyperionreactor.net/blog/token-based-authentication-rails-3-and-rails-2
В основном все, что вам нужно - это добавить токен к вашим запросам, и вы автоматически аутентифицируетесь, т.е.
локальный: 3000/posts.xml auth_token = the_token
Ответ 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, и этот учебник (упомянутый выше)