Я пытаюсь заставить клиента Ruby Oauth2.0 разговаривать с докером Ory Hydra, составить 5-минутную демонстрацию Я застрял на обмен кода аутентификации клиентского приложения для токена. ЛОГ ниже. Похоже, основная проблема заключается в следующем «hashedPassword не является хэшем заданного пароля».
Журнал отладки от HYDRA SERVER
time="2019-06-04T21:32:09Z" level=info msg="started handling request" method=POST remote="172.19.0.2:35482" request=/oauth2/token
hydra_1
time="2019-06-04T21:32:09Z" level=error msg="An error occurred" debug="crypto/bcrypt: hashedPassword is not the hash of the given password" description="Client authentication failed (e.g., unknown client, no client authentication included, or unsupported authentication method)" error=invalid_client
hydra_1
time="2019-06-04T21:32:09Z" level=info msg="completed handling request" measure#hydra/public: http://127.0.0.1:4444/.latency=92931900 method=POST remote="172.19.0.2:35482" request=/oauth2/token status=401 text_status=Unauthorized took=92.9319ms
Я прочитал здесь и кажется, что это "возможно".
Вот как я регистрирую своего клиента 'test-app9' в гидре:
docker-compose -f quickstart.yml exec hydra hydra clients create --endpoint http://127.0.0.1:4445 --id test-app9 --secret secret--skip-tls-verify --grant-types authorization_code,refresh_token,client_credentials,implicit --response-types token,code,id_token --scope profile --callbacks http://127.0.0.1:8088/auth/callback --token-endpoint-auth-method client_secret_post -g client_credentials
Я действительно вижу, как клиент появляется в postgres DB из демонстрации docker-compose. Пароль «секретный» хэшируется в БД.
Вот мой единственный файл Sinatra, действующий как клиент Oauth2.0:
<code>require 'rubygems'
require 'sinatra'
require 'oauth2'
require 'json'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
# If you add your authentication in the header then use ~Sclient_secret_basic~T
# If you add your authentication details in the post use ~Sclient_secret_post~T
def client
OAuth2::Client.new('test-app9',
'secret',
# 'c2VjcmV0',
:site => "http://127.0.0.1:4445",
:logger => Logger.new('example.log'),
:authorize_url => "http://127.0.0.1:4444/oauth2/auth",
:token_url => "http://hydra:4444/oauth2/token")
end
set :root, File.dirname(__FILE__)
set :views, Proc.new { File.join(root, "views") }
set :run, true
set :port, 80
get "/" do
erb :index
end
get '/auth' do
authorization_url = client.auth_code.authorize_url(:redirect_uri => redirect_uri, :response_type => "code", :scope => "profile", :state => "pqrst1234")
puts "Redirecting to URL: #{authorization_url.inspect}"
redirect authorization_url
end
get '/auth/callback' do
begin
access_token = client.auth_code.get_token(params[:code], :redirect_uri => redirect_uri, :client_id => "test-app9", :client_secret => 'secret', :headers => {'Authorization' => 'basic_auth_header', 'client_id' => 'test-app9', 'client_secret' => 'c2VjcmV0'} )
api_url = "/me.json"
me = JSON.parse(access_token.get(api_url).body)
erb "<p>Your data:\n#{me.inspect}</p>"
rescue OAuth2::Error => e
erb %(<p>Wassup #{$!}</p><p><a href="/auth">Retry</a></p>)
end
end
get '/auth/failure' do
erb "<h1>Authentication Failed:</h1><h3>message:<h3> <pre>#{params}
»
конец
def redirect_uri (путь = '/ auth / callback', запрос = ноль)
uri = URI.parse (request.url)
uri.path = путь
uri.query = запрос
uri.to_s
конец
__КОНЕЦ__
Итак, некоторые интересные заметки:
Очевидно, не имеет значения, с каким секретом я запускаю клиент OAuth2. Я могу использовать 'secret' или строку 'c2VjcmV0' в кодировке base64. В любом случае, я дохожу до раздела обмена токенами.
Я подстрелил это и закончил тем, что поместил client_id и client_secret в то, что, как я считаю, является правильным способом установки заголовков и тела.
Я пробовал много вариантов этого. Невозможно получить правильный синтаксис, что автор этого явно преуспел с ИЛИ У меня ошибка (сомнительно).
Кто-нибудь может здесь помочь?
UPDATE
Исправил это сам. Проблема была в синтаксисе при создании моего клиентского приложения. Это исправленная версия.
docker-compose -f quickstart.yml exec hydra hydra clients create --endpoint http://127.0.0.1:4445 --id test-app10 --secret secret --skip-tls-verify --grant-types authorization_code,refresh_token,client_credentials,implicit --response-types token,code,id_token --scope profile --callbacks http://127.0.0.1:8088/auth/callback --token-endpoint-auth-method client_secret_post -g client_credentials