Zammad: Question Oauth2

Créé le 7 mars 2017  ·  22Commentaires  ·  Source: zammad/zammad

Salut!

J'implémente un service Oauth2 et je souhaite me connecter à Zammad en l'utilisant.

Tout fonctionne bien, mais à l'étape où Zammad obtient le jeton d'accès et doit connecter l'utilisateur, j'obtiens l'erreur suivante dans les journaux :

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'"]

Je ne trouve aucune documentation sur la façon dont zammad récupèrerait les informations d'identification des utilisateurs via Oauth2 ?

Dans toute documentation Oauth2, la réponse à la demande de jeton ne doit contenir que les valeurs access_token et expires.

Pourriez-vous s'il vous plaît me donner un indice?

Meilleures salutations d'Autriche!

  • David
question

Commentaire le plus utile

Salut les gars!

Je résous mon problème avec wso2 en changeant le def raw_info comme suit :

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

Tous les 22 commentaires

Zammad ne prend pas en charge la méthode de connexion par jeton d'accès. Nous avons besoin des informations d'identification de l'utilisateur dans la charge utile de la réponse.

Tiré d'un ticket (#102057) :
Les autres fournisseurs fonctionnent comme suit :

Zammad est configuré pour un fournisseur d'authentification (par exemple Github). Après cela, l'icône s'affiche dans l'écran de connexion. Après avoir cliqué sur l'icône/le lien, l'utilisateur est redirigé vers une URL omniauth. Après cela, tout jusqu'à la réception des informations d'identification est hors de portée de Zammad et géré par omniauth.
Omniauth crée une URL et redirige l'utilisateur avec les paramètres OAuth2 requis vers la page de connexion correspondante du fournisseur. Là, l'authentification a lieu.
L'un des paramètres omniauth est l'URL de rappel. Une fois l'authentification terminée, l'utilisateur est redirigé vers cette URL par le fournisseur. L'URL de rappel est configurée dans notre liste de routage :

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

La route tunnelise la demande au contrôleur de sessions, qui essaie de déterminer l'utilisateur ou de le créer s'il est introuvable :

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

C'est fait ici :

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

Ces paramètres sont nécessaires à Zammad et doivent être soumis par le fournisseur. L'authentification basée sur les jetons n'est pas prise en charge.

Salut!

Je ne comprends pas votre réponse.

je viens d'essayer :
! Paramètres / Sécurité -> Configuration Oauth2 générique. !

  1. Sur la page de connexion, je clique sur OAuth2
  2. Mon navigateur me redirige vers l'URL d'autorisation définie dans la configuration avec les paramètres client_id, client_secret, redirect_uri, response_type et state.
  3. Ensuite, j'accepte la connexion à l'aide d'Oauth et mon fournisseur de services me redirige vers le redirect_uri donné avec l'état et le code des paramètres. (C'est le code d'autorisation, non ?)
  4. Zammad fait une demande en arrière-plan à l'url du jeton à partir de la configuration avec les paramètres client_id, client_secret, code, grant_type, redirect_uri. Dans ce cas grant_type =authorization_code donc je retourne le access_token.

Ce flux de travail est exactement ce qu'il devrait être en fonction de la documentation.

Je ne comprends pas, où nous devrions définir les userdata.

  • David

avec l'état et le code des paramètres. (C'est le code d'autorisation, non ?)

C'est le point : Zammad attend une structure de hachage contenant les données utilisateur et non un code d'authentification. Le Hash a besoin de la structure suivante :
https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L79

Votre point 4. n'a pas eu lieu. Zammad n'effectue aucune requête après la réussite d'une connexion OAuth.

Votre point 4. n'a pas eu lieu. Zammad n'effectue aucune requête après la réussite d'une connexion OAuth.

Mais le point 4 est la requête au TOKEN_URL qui se passe dans mes 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=97e53de185b1af64153b6a9364e1853f64153b6a93e HTTP/1.1" 302 840 " http://domain.tld/ " " Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, comme 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"

Je parle de la connexion de l'utilisateur en utilisant oauth2.

response_type=code n'est pas pris en charge par Zammad

Mais ce response_type=code est défini par Zammad lorsque j'appuie sur le bouton "Oauth2" sur la page de connexion ?
Ce n'est pas défini par mon fournisseur Oauth ??

je vais regarder

Salut @ThePatzen - désolé pour le retard. J'ai passé du temps avec la partie fournisseur OAuth2 et j'ai trouvé des personnes ayant un problème très similaire à vous : # 775

Utilisez-vous également la boîte à outils Django OAuth2 ? La solution de contournement fournie par @firelevapz ici fonctionne-t-elle également pour vous ?

J'ai hâte d'avoir de vos nouvelles.

Salut @thorsteneckel - pas de problème ! Non, je n'utilise pas cette boîte à outils. J'ai implémenté OAuth2 natif.

Est-ce que je comprends bien. Cette solution de contournement modifie le code zammad pour faire une demande distincte à /api/users/me pour obtenir les informations d'identification de l'utilisateur ?

Oh je vois. Oui, c'est exactement ce qu'il fait. Je pense que cela pourrait être une façon générale de procéder si j'ai bien compris votre scénario. Comme indiqué dans l'autre numéro, nous allons essayer d'intégrer cela dans Zammad. Cela couvrirait-il votre cas si vous pouviez configurer l'URL /api/users/me pour votre fournisseur ?

PS : Nice - l'implémenter en natif 🤓

De mon point de vue, le module OAuth2 a besoin d'un paramètre de configuration supplémentaire qui est "User lookup Url".

De plus, /vendor/lib/oauth2_database.rb devrait être modifié comme ceci :

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

Le code ci-dessus fonctionne-t-il dans votre cas ? L'as-tu testé ? Ce serait formidable de résoudre votre problème et #775 avec une stratégie d'authentification.

Salut!

Je suis actuellement absent du bureau. Je testerai ça demain et je vous répondrai dès que je l'aurai fait !

Cupidité d'Autriche !

Pas de soucis - nous sommes là 🤓 Salutations à l'Autriche depuis Berlin 🚀

Salut! De cette façon, la connexion fonctionne!

!MAIS! : Un nouveau compte utilisateur est créé à chaque fois ! Il n'est pas possible de se connecter à un déjà existant !

  • edit *: J'ai juste oublié le champ d'identifiant utilisateur. maintenant tout fonctionne !

Recommandation:
Je recommanderais également d'améliorer la configuration avec plusieurs champs :

  • URL pour la recherche d'utilisateur
  • Nom de champ dans la recherche-réponse de l'e-mail
  • Nom de champ dans la recherche-réponse de la connexion
  • Fieldname dans la recherche-réponse du prénom
  • Nom de champ dans la réponse de recherche du nom de famille
  • Fieldname dans la recherche-réponse de l'ID utilisateur ajouté

Je recommanderais le code suivant :
`class Oauth2Database < OmniAuth::Strategies::OAuth2
option :nom, 'oauth2'

def initialize(app, *args, &block)
# recherche dans la base de données
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
finir

def callback_url
full_host + script_name + callback_path
finir

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

info faire
{
email : raw_info[config['user_info_email']],
nom d'utilisateur : 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']],
}
finir

faire en plus
{
'raw_info' => raw_info
}
finir

def raw_info
@raw_info ||= access_token.get(config['user_info_url']).parsed
finir

fin`

Vous auriez besoin des champs de configuration suivants :

  • user_info_id
  • user_info_email
  • user_info_login
  • user_info_firstname
  • user_info_lastname
  • Salutations d'AT!
    David

Joli! Merci pour les commentaires. J'ai revu le code Omniauth et le nôtre. Pouvez-vous vérifier si vous avez des entrées dans votre table de base authorizations données Authorization.all .

Sinon, votre paramètre uid est probablement manquant.

Nous avons discuté du sujet et décidé d'étendre et de refactoriser l'ensemble de l'OAuth2. Cela inclura la mise en œuvre des configurations que vous avez recommandées. Cependant, cela peut prendre un certain temps car notre liste contient des tâches plus urgentes. Je vais créer un problème séparé pour cela et faire référence à ce problème ici.

Salut!

Oui maintenant il y a une entrée dans la table des autorisations !
Pour moi maintenant tout fonctionne! (En utilisant mon code modifié)

:-) Cupidité d'Innsbruck, Autriche :-)

JOLI! Cela vous dérangerait-il de publier votre solution ici afin que d'autres puissent en bénéficier / nous pouvons nous assurer que notre refactorisation est capable de remplacer vos personnalisations ?

Salutations à Innsbruck depuis Berlin 🤙

Salut! Désolé pour ma réponse tardive! Voici ma solution :

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

Cela doit être défini comme contenu du fichier /vendor/lib/oauth2_database.rb !

Votre application doit donner une réponse sous forme d'url /api/me avec tous les champs utilisés dans "raw_info".

Si quelqu'un a des questions, n'hésitez pas :-)

Niiiiice ! Merci @ThePatzen ! J'ai reformaté un peu le code. Fermeture pour le moment. Amusez-vous avec votre toute nouvelle authentification Zammad OAuth2

Salut les gars, j'ai le même problème en utilisant wso2is comme serveur d'identité. Je ne comprends pas que le chemin "/api/me" ne répond pas sur zammad, idem pour "/api/users/me" comme écrit dans les numéros 775. Sur zammad renspond uniquement "/api/v1/users/me" mais seulement si je me suis connecté... mais dans cette section je pense que je ne suis plus connecté... Quelqu'un peut m'aider s'il vous plaît ?

Salut les gars!

Je résous mon problème avec wso2 en changeant le def raw_info comme suit :

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
Cette page vous a été utile?
0 / 5 - 0 notes