Zammad: Pergunta Oauth2

Criado em 7 mar. 2017  ·  22Comentários  ·  Fonte: zammad/zammad

Oi!

Estou implementando um serviço Oauth2 e desejo fazer login no Zammad usando-o.

Tudo funciona bem, mas na etapa em que Zammad obtém o token de acesso e deve fazer o login do usuário, recebo o seguinte erro nos logs:

ERROR -- : Attribute 'login' required!
E, [2017-03-07T10:02:19.751951 #4144] ERROR -- : ["/opt/zammad/app/models/user.rb:833:in `check_login'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:432:in `block in make_lambda'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:164:in `block in halting'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:504:in `block in call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:504:in `each'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:504:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:92:in `__run_callbacks__'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:778:in `_run_validation_callbacks'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activemodel-4.2.7.1/lib/active_model/validations/callbacks.rb:113:in `run_validations!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activemodel-4.2.7.1/lib/active_model/validations.rb:338:in `valid?'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/validations.rb:58:in `valid?'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/validations.rb:83:in `perform_validations'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/validations.rb:37:in `save'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/attribute_methods/dirty.rb:21:in `save'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:286:in `block (2 levels) in save'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:351:in `block in with_transaction_returning_status'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/transaction.rb:184:in `within_new_transaction'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:220:in `transaction'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:348:in `with_transaction_returning_status'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:286:in `block in save'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:301:in `rollback_active_record_state!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/transactions.rb:285:in `save'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/persistence.rb:34:in `create'", "/opt/zammad/app/models/user.rb:291:in `create_from_hash!'", "/opt/zammad/app/models/authorization.rb:57:in `create_from_hash'", "/opt/zammad/app/controllers/sessions_controller.rb:145:in `create_omniauth'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/implicit_render.rb:4:in `send_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/abstract_controller/base.rb:198:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/rendering.rb:10:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/abstract_controller/callbacks.rb:20:in `block in process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:117:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:505:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:92:in `__run_callbacks__'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:81:in `run_callbacks'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/abstract_controller/callbacks.rb:19:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/rescue.rb:29:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:164:in `block in instrument'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:164:in `instrument'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/instrumentation.rb:30:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/params_wrapper.rb:250:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/railties/controller_runtime.rb:18:in `process_action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/abstract_controller/base.rb:137:in `process'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionview-4.2.7.1/lib/action_view/rendering.rb:30:in `process'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal.rb:196:in `dispatch'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_controller/metal.rb:237:in `block in action'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/routing/route_set.rb:74:in `dispatch'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/routing/route_set.rb:43:in `serve'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/journey/router.rb:43:in `block in serve'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/journey/router.rb:30:in `each'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/journey/router.rb:30:in `serve'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/routing/route_set.rb:817:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:408:in `call_app!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:362:in `callback_phase'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-oauth2-1.4.0/lib/omniauth/strategies/oauth2.rb:75:in `callback_phase'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:227:in `callback_call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:184:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:186:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:186:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:186:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:186:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:186:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:186:in `call!'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/strategy.rb:164:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/omniauth-1.3.1/lib/omniauth/builder.rb:63:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/etag.rb:24:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/conditionalget.rb:25:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/params_parser.rb:27:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/flash.rb:260:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/session/abstract/id.rb:225:in `context'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/session/abstract/id.rb:220:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/cookies.rb:560:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/query_cache.rb:36:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:88:in `__run_callbacks__'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:778:in `_run_call_callbacks'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/callbacks.rb:81:in `run_callbacks'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/callbacks.rb:27:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/remote_ip.rb:78:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/rack/logger.rb:38:in `call_app'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/rack/logger.rb:20:in `block in call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/tagged_logging.rb:68:in `block in tagged'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/tagged_logging.rb:26:in `tagged'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/tagged_logging.rb:68:in `tagged'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/rack/logger.rb:20:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/request_id.rb:21:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/runtime.rb:18:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/activesupport-4.2.7.1/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/actionpack-4.2.7.1/lib/action_dispatch/middleware/static.rb:120:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/sendfile.rb:113:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/engine.rb:518:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/railties-4.2.7.1/lib/rails/application.rb:165:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/rack-1.6.4/lib/rack/content_length.rb:15:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/puma-3.6.0/lib/puma/configuration.rb:225:in `call'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/puma-3.6.0/lib/puma/server.rb:578:in `handle_request'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/puma-3.6.0/lib/puma/server.rb:415:in `process_client'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/puma-3.6.0/lib/puma/server.rb:275:in `block in run'", "/opt/zammad/vendor/bundle/ruby/2.3.0/gems/puma-3.6.0/lib/puma/thread_pool.rb:116:in `block in spawn_thread'"]

Não encontro nenhuma documentação sobre como o zammad buscaria as credenciais do usuário via Oauth2.

Em qualquer documentação Oauth2, a resposta à solicitação de token deve conter apenas os valores access_token e expires.

Você poderia me dar uma dica?

Atenciosamente, da Áustria!

  • David
question

Comentários muito úteis

Oi, pessoal!

Eu resolvo meu problema com wso2is alterando o def raw_info da seguinte maneira:

def raw_info
  <strong i="7">@raw_info</strong> ||= begin
    uri = URI.parse('https://mywso2is/oauth2/userinfo?schema=openid')
    request = Net::HTTP::Get.new(uri)
    request['Authorization'] = 'Bearer ' + access_token.token

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    JSON.parse(response.body)
  end
end

Todos 22 comentários

Zammad não oferece suporte ao método de login do Token de Acesso. Precisamos das credenciais do usuário na carga útil da resposta.

Retirado de um tíquete (# 102057):
Outros provedores funcionam da seguinte forma:

Zammad é configurado para um provedor de autenticação (por exemplo, Github). Depois disso, o ícone é mostrado na tela de login. Após clicar no ícone / link, o usuário é redirecionado para uma URL Omniauth. Depois disso, tudo até o recebimento das credenciais está fora do escopo do Zammad e controlado pelo omniauth.
Omniauth cria um URL e redireciona o usuário com os parâmetros OAuth2 necessários para a página de login correspondente do provedor. Aí ocorre a autenticação.
Um dos parâmetros omniauth é o URL de retorno de chamada. Depois que a autenticação é feita, o usuário é redirecionado para esta URL pelo provedor. O URL de retorno de chamada está configurado em nossa lista de rotas:

https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/config/routes/auth.rb#L5

A rota canaliza a solicitação para o controlador de sessões, que tenta determinar o usuário ou criá-lo se não puder ser encontrado:

https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/controllers/sessions_controller.rb#L144

Isso é feito aqui:

https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L54

Esses parâmetros são necessários para a Zammad e devem ser enviados pelo provedor. A autenticação baseada em token não é suportada.

Oi!

Eu não entendo sua resposta.

Eu apenas tentei:
! Configurações / Segurança -> Configuração do Oauth2 genérico. !

  1. Na página de login, clico em OAuth2
  2. Meu navegador me redireciona para o url de autorização conforme definido na configuração com os parâmetros client_id, client_secret, redirect_uri, response_type e state.
  3. Então eu aceito o Login usando Oauth e meu provedor de serviços me redireciona para o redirect_uri fornecido com o estado e código de params. (Este é o código de autorização, certo?)
  4. Zammad faz uma solicitação em segundo plano para a url do token da configuração com parâmetros client_id, client_secret, code, grant_type, redirect_uri. Neste caso, grant_type = authority_code, então eu retorno o access_token.

Este fluxo de trabalho é exatamente como deveria ser dependendo da documentação.

Eu não entendo, onde devemos definir o userdata.

  • David

com o estado e código params. (Este é o código de autorização, certo?)

Esse é o ponto: Zammad espera uma estrutura Hash contendo os dados do usuário, não um código de autenticação. O Hash precisa da seguinte estrutura:
https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L79

Seu ponto 4. não aconteceu. Zammad não executa nenhuma solicitação depois que um login OAuth foi bem-sucedido.

Seu ponto 4. não aconteceu. Zammad não executa nenhuma solicitação depois que um login OAuth foi bem-sucedido.

Mas o ponto 4 é a solicitação para o TOKEN_URL que acontece nos meus logs?

  • 192.168.4.142 - - [07 / Mar / 2017: 14: 33: 23 +0100] "GET /oauth/authorize?client_id=0815&redirect_uri=http%3A%2F%2Fdomain.tld%2Fauth%2Foauth2%2Fcallback&response_type=code&state=97e53de9acb6f6a1b1af41a75dd65e8893e853c53bb64d1b HTTP / 1.1 "302 840" http: //domain.tld/ "" Mozilla / 5.0 (Windows NT 6.1; Win64; x64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 56.0.2924.87 Safari / 537.36 "
  • 192.168.4.64 - - [07 / mar / 2017: 14: 33: 23 +0100] "POST / oauth / token HTTP / 1.1" 200 216 "-" "Faraday v0.9.2"

Falo sobre o login do usuário usando oauth2.

response_type=code não é compatível com Zammad

Mas este response_type=code é definido por Zammad quando pressiono o botão "Oauth2" na página de login?
Isso não foi definido pelo meu provedor Oauth ??

🤔 vou dar uma olhada

Olá @ThePatzen - desculpe pela demora. Passei algum tempo com a parte do provedor OAuth2 e descobri que algumas pessoas estão tendo um problema muito semelhante a você: # 775

Você também usa o kit de ferramentas Django OAuth2? A solução alternativa fornecida por @firlevapz aqui funciona para você também?

Ansioso para ouvir de você.

Olá @thorsteneckel - sem problemas! Não, eu não uso este kit de ferramentas. Implementei OAuth2 nativo.

Eu entendo direito. Esta solução alternativa altera o código zammad para fazer uma solicitação separada para / api / users / me para obter as credenciais do usuário.

Oh, eu vejo. Sim, é exatamente isso que faz. Eu acho que essa poderia ser uma maneira geral de você ir se eu entender seu cenário direito. Conforme declarado na outra edição, tentaremos colocar isso no Zammad. O seu caso seria atendido se você pudesse configurar o URL /api/users/me para o seu provedor?

PS: Legal - implementação nativa 🤓

Do meu ponto de vista, o Módulo OAuth2 precisa de um parâmetro de configuração adicional que é o "URL de pesquisa do usuário".

Além disso, /vendor/lib/oauth2_database.rb deve ser alterado assim:

class Oauth2Database < OmniAuth::Strategies::OAuth2
  option :name, 'oauth2'

  def initialize(app, *args, &block)
    # database lookup
    config  = Setting.get('auth_oauth2_credentials') || {}
    args[0] = config['app_id']
    args[1] = config['app_secret']
    args[2][:client_options] = args[2][:client_options].merge(config.symbolize_keys)
    super
  end

  def callback_url
    full_host + script_name + callback_path
  end

  uid { raw_info['id'] }

  info do
    {
      email: raw_info['email'],
      username: raw_info['username'],
      login: raw_info['email'],
      first_name: raw_info['first_name'],
      last_name: raw_info['last_name'],
    }
  end

  extra do
    {
      'raw_info' => raw_info
    }
  end

  def raw_info
    <strong i="7">@raw_info</strong> ||= access_token.get(config['user_info_url']).parsed
  end

end

O código acima funciona no seu caso? Você já testou? Seria ótimo resolver seu problema e # 775 com uma estratégia de autenticação.

Oi!

Atualmente estou fora do escritório. Vou testar isso amanhã e dar uma resposta assim que terminar!

Ganância da Áustria!

Não se preocupe - estamos aqui 🤓 Saudações à Áustria de Berlim 🚀

Oi! Assim o login funciona!

! MAS !: Uma nova conta de usuário é criada a cada vez! Não é possível fazer o login em um já existente!

  • edit *: Eu apenas esqueci o campo de id do usuário. agora tudo funciona!

Recomendação:
Eu também recomendaria aprimorar a configuração com vários campos:

  • URL para a pesquisa do usuário
  • Fieldname na pesquisa-resposta do e-mail
  • Fieldname na resposta de pesquisa do login
  • Fieldname na resposta de pesquisa do primeiro nome
  • Fieldname na resposta de pesquisa do sobrenome
  • Fieldname na resposta de pesquisa do ID do usuário adicionado

Eu recomendaria o seguinte código:
`class Oauth2Database <OmniAuth :: Strategies :: OAuth2
opção: nome, 'oauth2'

def initialize (app, * args, & block)
# pesquisa de banco de dados
config = Setting.get ('auth_oauth2_credentials') || {}
args [0] = config ['app_id']
args [1] = config ['app_secret']
args [2] [: client_options] = args [2] [: client_options] .merge (config.symbolize_keys)
super
fim

def callback_url
full_host + script_name + callback_path
fim

uid {raw_info [config ['user_info_id']]}

informação fazer
{
email: raw_info [config ['user_info_email']],
nome de usuário: raw_info [config ['user_info_username']],
login: raw_info [config ['user_info_login']],
first_name: raw_info [config ['user_info_firstname']],
last_name: raw_info [config ['user_info_lastname']],
}
fim

extra fazer
{
'raw_info' => raw_info
}
fim

def raw_info
@raw_info || = access_token.get (config ['user_info_url']). analisado
fim

fim`

Você precisaria dos seguintes campos de configuração:

  • user_info_id
  • user_info_email
  • user_info_login
  • user_info_firstname
  • user_info_lastname
  • Atenciosamente da AT!
    David

Agradável! Obrigado pelo feedback. Dei outra olhada no código Omniauth e no nosso. Você pode verificar se há entradas em sua tabela de banco de dados authorizations ? Você pode verificar isso por acesso direto ou pelo console Rails Authorization.all .

Caso contrário, provavelmente falta o parâmetro uid .

Discutimos o tópico e decidimos estender e refatorar toda a coisa do OAuth2. Isso incluirá a implementação das configurações que você recomendou. No entanto, isso pode levar algum tempo, pois nossa lista tem algumas tarefas mais urgentes. Vou criar um problema separado para isso e me referir a esse problema aqui então.

Oi!

Sim, agora existe uma entrada na tabela de autorizações!
Para mim agora tudo funciona! (Usando meu código alterado)

:-) Greeds de Innsbruck, Áustria :-)

LEGAIS! Você se importaria de postar sua solução aqui para que outros possam se beneficiar dela / podemos garantir que nossa refatoração seja capaz de substituir suas personalizações?

Saudações de Berlim para Innsbruck 🤙

Oi! Desculpa pelo atraso da minha resposta! Esta é minha solução:

class Oauth2Database < OmniAuth::Strategies::OAuth2
  option :name, 'oauth2'

  def initialize(app, *args, &block)
    # database lookup
    config = Setting.get('auth_oauth2_credentials') || {}
    args[0] = config['app_id']
    args[1] = config['app_secret']
    args[2][:client_options] = args[2][:client_options].merge(config.symbolize_keys)
    super
  end

  def callback_url
    full_host + script_name + callback_path
  end

  uid { raw_info['id'] }

  info do
    {
      email:      raw_info['email'],
      username:   raw_info['username'],
      login:      raw_info['login'],
      first_name: raw_info['firstname'],
      last_name:  raw_info['lastname'],
    }
  end

  extra do
    {
    'raw_info' => raw_info
    }
  end

  def raw_info
    <strong i="6">@raw_info</strong> ||= access_token.get('/api/me').parsed
  end

end

Isso deve ser definido como conteúdo do arquivo /vendor/lib/oauth2_database.rb!

Seu aplicativo deve fornecer uma resposta como url / api / me com todos os campos usados ​​em "raw_info".

Se houver alguma pergunta de alguém, sinta-se à vontade para perguntar :-)

Niiiiice! Obrigado @ThePatzen! Reformatei um pouco o código. Fechando por enquanto. Divirta-se com sua nova autenticação Zammad OAuth2 🤓

Olá pessoal, estou com o mesmo problema ao usar wso2is como servidor de identidade. Não entendo o caminho "/ api / me" não responde no zammad, o mesmo para "/ api / users / me", como escrever nas edições 775. No zammad renspond apenas "/ api / v1 / users / me" mas apenas se eu logar ... mas nesta seção eu acho que não estou logado novamente ... Alguém pode me ajudar por favor?

Oi, pessoal!

Eu resolvo meu problema com wso2is alterando o def raw_info da seguinte maneira:

def raw_info
  <strong i="7">@raw_info</strong> ||= begin
    uri = URI.parse('https://mywso2is/oauth2/userinfo?schema=openid')
    request = Net::HTTP::Get.new(uri)
    request['Authorization'] = 'Bearer ' + access_token.token

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    JSON.parse(response.body)
  end
end
Esta página foi útil?
0 / 5 - 0 avaliações