Ruby Oauth2.0: client_secret_post не работает с ory hydra - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь заставить клиента 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 конец __КОНЕЦ__

Итак, некоторые интересные заметки:

  1. Очевидно, не имеет значения, с каким секретом я запускаю клиент OAuth2. Я могу использовать 'secret' или строку 'c2VjcmV0' в кодировке base64. В любом случае, я дохожу до раздела обмена токенами.

  2. Я подстрелил это и закончил тем, что поместил 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
...