Ошибка таймаута Фарадея с omniauth (пользовательская стратегия)/ администратор
Я в настоящее время следую за этим Railscast и для моей конкретной ситуации я сталкиваюсь с ошибкой тайм-аута Фарадея при обратном вызове от omniauth.
В настоящее время я использую приложение rails в качестве API и магистраль в качестве внешнего интерфейса javascript (в том же приложении)
Я решил, что хочу заблокировать API с помощью OAuth, и предоставил для Omniauth собственную стратегию доступа к API как к клиенту, а также к Doorkeeper для обработки логики авторизации.
module OmniAuth
module Strategies
class Twiddle < OmniAuth::Strategies::OAuth2
option :name, :twiddle
option :client_options, {
site: "http://localhost:3001",
authorize_path: "/oauth/authorize"
}
uid do
raw_info["id"]
end
info do
{
firstName: raw_info["firstName"],
lastName: raw_info["lastName"],
email: raw_info["email"]
}
end
def raw_info
@raw_info ||= access_token.get('/api/v1/user').parsed
end
end
end
end
Я включил пользовательскую стратегию так:
require File.expand_path('lib/omniauth/strategies/twiddle', Rails.root)
Rails.application.config.middleware.use OmniAuth::Builder do
provider :twiddle, id, secret # Omitting the actual ones for obvious reasons
end
В настоящее время я использую эти драгоценные камни в моем комплекте
# OAuth
gem 'oauth2'
gem 'omniauth'
gem 'omniauth-oauth2'
gem 'omniauth-facebook'
gem 'doorkeeper'
Здесь я проверяю подлинность и пытаюсь получить правильный токен доступа (а также где я застреваю)
def loginParse
if ( user = User.authenticate( params[:email], params[:password] ) )
session[:user_id] = user.id
redirect_to '/auth/twiddle/'
else
render :controller => "authentication", :action => "loginIndex", :notice => "Incorrect credentials"
end
end
Вот маршрутизация с маршрутами.
# Oauth urls
match '/auth/twiddle/callback', to: "authentication#connectAPI"
match "/auth/facebook/callback", to: "authentication#loginSocialMedia"
Приложение никогда не сможет отрендерить действие connectAPI, полностью застряв на этом этапе (задано журналами сервера).
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Doorkeeper::Application Load (0.2ms) SELECT `oauth_applications`.* FROM `oauth_applications` WHERE `oauth_applications`.`uid` = '' LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Doorkeeper::AccessToken Load (0.3ms) SELECT `oauth_access_tokens`.* FROM `oauth_access_tokens` WHERE `oauth_access_tokens`.`revoked_at` IS NULL AND `oauth_access_tokens`.`application_id` = 1 AND `oauth_access_tokens`.`resource_owner_id` = 1 ORDER BY created_at desc LIMIT 1
(0.1ms) BEGIN
Doorkeeper::AccessGrant Load (0.2ms) SELECT `oauth_access_grants`.* FROM `oauth_access_grants` WHERE `oauth_access_grants`.`token` = '' LIMIT 1
SQL (1.1ms) INSERT INTO `oauth_access_grants` (`application_id`, `created_at`, `expires_in`, `redirect_uri`, `resource_owner_id`, `revoked_at`, `scopes`, `token`) VALUES (1, '2012-08-08 03:10:31', 600, 'http://localhost:3001/auth/twiddle/callback', 1, NULL, '', '')
(1.4ms) COMMIT
Redirected to http://localhost:3001/auth/twiddle/callback?code=a
Completed 302 Found in 12ms (ActiveRecord: 3.7ms)
(twiddle) Callback phase initiated.
Многие из идентификаторов / важной информации были опущены в журнале.
Наконец эта ошибка дана:
Фарадей:: Ошибка::TimeoutError (Тайм-аут:: Ошибка):
Я надеюсь, что я тщательно объяснил эту проблему.
Я не знаю, почему именно приложение, кажется, зависает при инициализации обратного вызова omniauth. Я попытался обновить bundler, так как несколько других вопросов, связанных со стековым потоком, указывали на меня, но он не работает.
Возможно, мое понимание OAuth2 немного мутно.
Если кто-нибудь может мне помочь, я был бы очень признателен
1 ответ
Я не уверен, что это относится к вам, здесь был мой сценарий
проблема
- Приложение с данными, которые хочет наш внутренний сервер OAuth
- OAuth-сервер с небольшим, без данных на нем
- Мы хотим переложить часть аутентификации App1 в App2 без перемещения данных
Решение
- App1 использует App2 в качестве сервера аутентификации
- App2 использует App1 для пользовательских данных
Проблема из этого решения
Deadlock - App1 ожидает OAuth-ответ от App2, но для его завершения App2 должен дождаться ответа от App1.
Заключительное наблюдение
В режиме разработки на Rails (с WebBrick) вы не можете запускать многопоточные, поэтому запрос может никогда не быть завершен.
Мое решение
Моим решением было установить Puma и добавить вconfig/environments/development.rb
:
if ENV["THREADS"]
config.threadsafe!
end
Затем, когда вы запускаете сервер, вы будете делать THREADS=1 rails s Puma
чтобы проверить ваши вещи OAuth.
ИЛИ ЖЕ
Или ваш сценарий совершенно другой, и вы фактически не общаетесь между своими службами. Твой extra_info
(как у Гитхуба /user
) функционирование конечной точки на сервере OAuth? Ваш обратный вызов на самом деле что-то делает?
Надеюсь, это поможет!