Zammad: OAuth2 Frage

Erstellt am 7. März 2017  ·  22Kommentare  ·  Quelle: zammad/zammad

Hi!

Ich implementiere einen Oauth2-Dienst und möchte mich damit bei Zammad anmelden.

Alles funktioniert gut, aber bei dem Schritt, in dem Zammad das Access Token erhält und den Benutzer anmelden sollte, erhalte ich die folgende Fehlermeldung in den Protokollen:

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

Ich finde keine Dokumentation darüber, wie Zammad Benutzeranmeldeinformationen über Oauth2 abrufen würde?

In jeder Oauth2-Dokumentation sollte die Antwort auf die Token-Anfrage nur den access_token- und den expires-Wert enthalten.

Könnten Sie mir bitte einen Hinweis geben?

Viele Grüße aus Österreich!

  • David
question

Hilfreichster Kommentar

Hallo Leute!

Ich löse mein Problem mit wso2is, das die def raw_info wie folgt ändert:

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

Alle 22 Kommentare

Zammad unterstützt die Zugangs-Token-Anmeldemethode nicht. Wir benötigen die Anmeldeinformationen des Benutzers in der Antwortnutzlast.

Aus einem Ticket entnommen (#102057):
Andere Anbieter arbeiten wie folgt:

Zammad ist für einen Auth-Provider (zB Github) konfiguriert. Danach wird das Symbol im Anmeldebildschirm angezeigt. Nach dem Klick auf das Icon/Link wird der Benutzer auf eine Omniauth-URL weitergeleitet. Danach ist alles bis zum Erhalt der Anmeldeinformationen außerhalb des Zammad-Bereichs und wird von omniauth verarbeitet.
Omniauth erstellt eine URL und leitet den Benutzer mit den erforderlichen OAuth2-Parametern auf die passende Anmeldeseite des Anbieters um. Dort findet die Authentifizierung statt.
Einer der Omniauth-Parameter ist die Callback-URL. Nachdem die Authentifizierung abgeschlossen ist, wird der Benutzer vom Provider auf diese URL umgeleitet. Die Callback-URL ist in unserer Routenliste konfiguriert:

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

Die Route tunnelt die Anfrage an den Sitzungscontroller, der versucht, den Benutzer zu ermitteln oder ihn zu erstellen, wenn er nicht gefunden werden konnte:

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

Das wird hier gemacht:

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

Diese Parameter werden von Zammad benötigt und müssen vom Anbieter übermittelt werden. Die tokenbasierte Authentifizierung wird nicht unterstützt.

Hi!

Ich verstehe deine Antwort nicht.

Ich habe es versucht:
! Einstellungen / Sicherheit -> Generic Oauth2 einrichten. !

  1. Auf der Login-Seite klicke ich auf OAuth2
  2. Mein Browser leitet mich auf die Autorisierungs-URL um, wie sie in der Konfiguration mit den Parametern client_id, client_secret, redirect_uri, response_type und state festgelegt ist.
  3. Dann akzeptiere ich die Anmeldung mit Oauth und mein Dienstanbieter leitet mich mit dem Parameterstatus und -code an die angegebene redirect_uri weiter. (Das ist der Autorisierungscode, oder?)
  4. Zammad fordert im Hintergrund die Token-URL aus der Konfiguration mit den Parametern client_id, client_secret, code, grant_type, redirect_uri an. In diesem Fall grant_type = authorization_code, also gebe ich den access_token zurück.

Dieser Workflow ist genau so, wie er je nach Dokumentation sein sollte.

Ich verstehe nicht, wo wir die Benutzerdaten setzen sollen.

  • David

mit den Parametern state und code. (Das ist der Autorisierungscode, oder?)

Das ist der Punkt: Zammad erwartet eine Hash-Struktur, die die Benutzerdaten enthält, keinen Auth-Code. Der Hash benötigt folgende Struktur:
https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L79

Ihr Punkt 4. hat nicht stattgefunden. Zammad führt keine Anfragen aus, nachdem eine OAuth-Anmeldung erfolgreich war.

Ihr Punkt 4. hat nicht stattgefunden. Zammad führt keine Anfragen aus, nachdem eine OAuth-Anmeldung erfolgreich war.

Aber Punkt 4 ist die Anfrage an die TOKEN_URL, die in meinen Logs passiert?

  • 192.168.4.142 - - [07/Mär/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=97e53a1d1bb653 HTTP/1.1" 302 840 " http://domain.tld/ " "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, wie 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"

Ich spreche über die Benutzeranmeldung mit oauth2.

response_type=code wird von Zammad nicht unterstützt

Aber dieses response_type=code wird von Zammad gesetzt, wenn ich den "Oauth2"-Button auf der Login-Seite drücke?
Das ist nicht von meinem Oauth-Provider eingestellt??

🤔 ich schau mal nach

Hallo @ThePatzen - sorry für die Verspätung. Ich verbringe einige Zeit mit dem OAuth2-Anbieterteil und habe einige Leute gefunden, die ein sehr ähnliches Problem wie Sie haben: #775

Verwenden Sie auch das Django OAuth2-Toolkit? Funktioniert der hier von @firlevapz bereitgestellte Workaround auch für Sie?

Freue mich von Dir zu hören.

Hallo @thorsteneckel - kein Problem! Nein, ich benutze dieses Toolkit nicht. Ich habe OAuth2 nativ implementiert.

Verstehe ich richtig. Diese Problemumgehung ändert den zammad-Code, um eine separate Anfrage an /api/users/me zu senden, um die Anmeldeinformationen des Benutzers abzurufen?

Ach ich verstehe. Ja, genau das tut es. Ich denke, das könnte ein allgemeiner Weg für Sie sein, wenn ich Ihr Szenario richtig verstehe. Wie in der anderen Ausgabe erwähnt, werden wir versuchen, dies in Zammad zu integrieren. Würde es Ihren Fall abdecken, wenn Sie die URL /api/users/me für Ihren Anbieter konfigurieren könnten?

PS: Schön - nativ implementieren 🤓

Aus meiner Sicht benötigt das OAuth2-Modul einen zusätzlichen Konfigurationsparameter, der die "User-Lookup-URL" ist.

Auch /vendor/lib/oauth2_database.rb sollte wie folgt geändert werden:

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

Funktioniert der obige Code in Ihrem Fall? Hast du es getestet? Es wäre großartig, Ihr Problem und #775 mit einer Authentifizierungsstrategie zu lösen.

Hi!

Ich bin derzeit abwesend. Ich teste das morgen und antworte dir sobald ich es geschafft habe!

Gier aus Österreich!

Keine Sorge - wir sind da 🤓 Grüße nach Österreich aus Berlin 🚀

Hi! So funktioniert die Anmeldung!

!ABER!: Jedes Mal wird ein neues Benutzerkonto erstellt! Es ist nicht möglich, sich an einem bereits bestehenden anzumelden!

  • edit *: Ich habe gerade das Benutzer-ID-Feld vergessen. jetzt funktioniert alles!

Empfehlung:
Ich würde auch empfehlen, die Konfiguration um mehrere Felder zu erweitern:

  • URL für die Benutzersuche
  • Feldname in der Lookup-Antwort der E-Mail
  • Feldname in der Lookup-Antwort des Logins
  • Feldname in der Lookup-Antwort des Vornamens
  • Feldname in der Lookup-Antwort des Nachnamens
  • Feldname in der Lookup-Antwort der Benutzer-ID hinzugefügt

Ich würde folgenden Code empfehlen:
`Klasse Oauth2Database < OmniAuth::Strategies::OAuth2
Option: Name, 'oauth2'

def initialize(app, *args, &block)
# Datenbanksuche
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
Ende

def callback_url
full_host + script_name + callback_path
Ende

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

info tun
{
email: raw_info[config['user_info_email']],
Benutzername: raw_info[config['user_info_username']],
Login: raw_info[config['user_info_login']],
Vorname: raw_info[config['user_info_firstname']],
Nachname: raw_info[config['user_info_lastname']],
}
Ende

extra tun
{
'raw_info' => raw_info
}
Ende

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

Ende`

Sie benötigen die folgenden Konfigurationsfelder:

  • user_info_id
  • user_info_email
  • user_info_login
  • user_info_firstname
  • user_info_nachname
  • Grüße von AT!
    David

Schön! Danke für die Rückmeldung. Ich habe mir den Omniauth-Code und unseren noch einmal angeschaut. Können Sie bitte überprüfen, ob Sie Einträge in Ihrer authorizations Datenbanktabelle haben? Sie können dies entweder über den Direktzugriff oder die Rails-Konsole Authorization.all überprüfen.

Wenn nicht, fehlt wahrscheinlich Ihr Parameter uid .

Wir haben das Thema diskutiert und beschlossen, das ganze OAuth2-Ding zu erweitern und zu refaktorieren. Dies beinhaltet die Implementierung der von Ihnen empfohlenen Konfigurationen. Dies kann jedoch einige Zeit in Anspruch nehmen, da unsere Liste dringendere Aufgaben enthält. Ich werde dafür eine separate Ausgabe erstellen und dann auf diese Ausgabe hier verweisen.

Hi!

Ja jetzt gibt es einen Eintrag in der Berechtigungstabelle!
Bei mir funktioniert jetzt alles! (Mit meinem geänderten Code)

:-) Gier aus Innsbruck,Österreich :-)

NETT! Würde es Ihnen etwas ausmachen, Ihre Lösung hier zu veröffentlichen, damit andere davon profitieren können / wir sicherstellen können, dass unser Refactoring Ihre Anpassungen ersetzen kann?

Grüße nach Innsbruck aus Berlin 🤙

Hi! Entschuldigung für die späte Antwort! Hier meine Lösung:

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

Dies muss als Inhalt der Datei /vendor/lib/oauth2_database.rb gesetzt werden!

Ihre Anwendung muss eine Antwort als URL /api/me mit allen in "raw_info" verwendeten Feldern geben.

Wenn es Fragen von jemandem gibt, können Sie ihn gerne stellen :-)

Niiiiice! Danke @ThePatzen! Ich habe den Code etwas umformatiert. Schließung vorerst. Viel Spaß mit deiner glänzenden neuen Zammad OAuth2-Authentifizierung 🤓

Hallo Leute, ich habe das gleiche Problem mit wso2is als Identitätsserver. Ich verstehe nicht, dass der Pfad "/api/me" auf Zammad nicht reagiert, das gleiche gilt für "/api/users/me" wie in den Ausgaben 775. Auf Zammad antworten nur "/api/v1/users/me" aber nur wenn ich mich eingeloggt habe... aber in diesem Abschnitt glaube ich, ich bin nicht wieder eingeloggt... Kann mir bitte jemand helfen?

Hallo Leute!

Ich löse mein Problem mit wso2is, das die def raw_info wie folgt ändert:

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
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen