Zammad: OAuth2 рдкреНрд░рд╢реНрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдорд╛рд░реНрдЪ 2017  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: zammad/zammad

рдирдорд╕реНрддреЗ!

рдореИрдВ рдПрдХ Oauth2 рд╕реЗрд╡рд╛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Zammad рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред

рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрд╕ рдЪрд░рдг рдореЗрдВ рдЬрд╣рд╛рдВ рдЬрд╝рдордж рдХреЛ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдореБрдЭреЗ рд▓реЙрдЧ рдореЗрдВ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

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

рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ zammad Oauth2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдг-рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛?

рдХрд┐рд╕реА рднреА Oauth2 рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЯреЛрдХрди-рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЗрд╡рд▓ access_token рдФрд░ рдПрдХ рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдПрдХ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

рдСрд╕реНрдЯреНрд░рд┐рдпрд╛ рдХреА рдУрд░ рд╕реЗ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ!

  • рдбреЗрд╡рд┐рдб

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ!

рдореИрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди wso2is рдХреЗ рд╕рд╛рде def raw_info рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реВрдВ:

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

рд╕рднреА 22 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Zammad рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рд▓реЙрдЧрд┐рди рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреЗрд▓реЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╛рдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЯрд┐рдХрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ (#102057):
рдЕрдиреНрдп рдкреНрд░рджрд╛рддрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

Zammad рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдкреНрд░рджрд╛рддрд╛ (рдЬреИрд╕реЗ Github) рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд▓реЙрдЧрд┐рди рд╕реНрдХреНрд░реАрди рдореЗрдВ рдЖрдЗрдХрди рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдХрди/рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╕рд░реНрд╡рдорд╛рдиреНрдп URL рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рддрдХ рд╕рдм рдХреБрдЫ рдЬрд╝рдорд╛рдж рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдФрд░ рд╕рд░реНрд╡рдЬреНрдЮ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Omniauth рдПрдХ URL рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ OAuth2 рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред
рд╕рд░реНрд╡рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЙрд▓рдмреИрдХ URL рд╣реИред рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ URL рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрд▓рдмреИрдХ URL рд╣рдорд╛рд░реА рд░реВрдЯ рд╕реВрдЪреА рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдорд╛рд░реНрдЧ рд╕рддреНрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реБрд░рдВрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ:

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

рдпрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд╝рдорд╛рдж рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╣реИрдВред рдЯреЛрдХрди рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдирдорд╕реНрддреЗ!

рдореБрдЭреЗ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣реА рд╣реИред

рдореИрдВрдиреЗ рдЕрднреА рдХреЛрд╢рд┐рд╢ рдХреА:
! рд╕реЗрдЯрд┐рдВрдЧреНрд╕ / рд╕реБрд░рдХреНрд╖рд╛ -> рд╕рд╛рдорд╛рдиреНрдп OAuth2 рд╕реЗрдЯ рдЕрдкред !

  1. рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдкрд░ рдореИрдВ OAuth2 . рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ
  2. рдореЗрд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореБрдЭреЗ рдХреНрд▓рд╛рдЗрдВрдЯ_рдЖрдИрдбреА, рдХреНрд▓рд╛рдЗрдВрдЯ_рд╕реЗрдХреНрд░реЗрдЯ, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА, рд░рд┐рд╕реНрдкреЙрдиреНрд╕_рдЯрд╛рдЗрдк рдФрд░ рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдореЗрдВ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХреГрдд рдпреВрдЖрд░рдПрд▓ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред
  3. рдлрд┐рд░ рдореИрдВ рдУрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореЗрд░рд╛ рд╕реЗрд╡рд╛-рдкреНрд░рджрд╛рддрд╛ рдореБрдЭреЗ рджрд┐рдП рдЧрдП рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА рдкрд░ рдкреИрд░рд╛рдореНрд╕ рд░рд╛рдЬреНрдп рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред (рдпрд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рд╣реИ, рд╣реИ рдирд╛?)
  4. Zammad params рдХреНрд▓рд╛рдЗрдВрдЯ_рдЖрдИрдбреА, рдХреНрд▓рд╛рдЗрдВрдЯ_рд╕реЗрдХреНрд░реЗрдЯ, рдХреЛрдб, рдЧреНрд░рд╛рдВрдЯ_рдЯрд╛рдЗрдк, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдЯреЛрдХрди рдпреВрдЖрд░рдПрд▓ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдиреБрджрд╛рди_рдкреНрд░рдХрд╛рд░ = рдкреНрд░рд╛рдзрд┐рдХрд░рдг_рдХреЛрдб рдЗрд╕рд▓рд┐рдП рдореИрдВ access_token рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реВрдВред

рдпрд╣ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдпреВрдЬрд░рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  • рдбреЗрд╡рд┐рдб

рдкрд░рдо рд░рд╛рдЬреНрдп рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рдеред (рдпрд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рд╣реИ, рд╣реИ рдирд╛?)

рдпрд╣реА рдмрд╛рдд рд╣реИ: рдЬрд╝рдордж рдПрдХ рд╣реИрд╢ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рди рдХрд┐ рдПрдХ рдХреЛрдбред рд╣реИрд╢ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L79

рдЖрдкрдХреА рдмрд╛рдд 4. рдирд╣реАрдВ рд╣реБрдИред OAuth рд▓реЙрдЧрд┐рди рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж Zammad рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреА рдмрд╛рдд 4. рдирд╣реАрдВ рд╣реБрдИред OAuth рд▓реЙрдЧрд┐рди рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж Zammad рдХреЛрдИ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдмрд┐рдВрджреБ 4 TOKEN_URL рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓реЙрдЧ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ?

  • резрепреи.резремрео.рек.резрекреи - - [режрен/рдорд╛рд░реНрдЪ/реирежрезрен:резрек:рейрей:реирей +режрезрежреж] "GET /oauth/authorize?client_id=0815&redirect_uri=http%3A%2F%2Fdomain.tld%2Fauth%2Foauth2%2Fcallback&response_type=code&state=97e53bda1b1addc75df65e HTTP/1.1" 302 840 " http://domain.tld/ "" Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, рдЬреИрд╕реЗ Gecko) Chrome/56.0.2924.87 Safari/537.36"
  • 192.168.4.64 - - [07/рдорд╛рд░реНрдЪ/2017:14:33:23 +0100] "рдкреЛрд╕реНрдЯ/рдУрде/рдЯреЛрдХрди HTTP/1.1" 200 216 "-" "рдлреИрд░рд╛рдбреЗ v0.9.2"

рдореИрдВ oauth2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВред

response_type=code Zammad рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ

рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд▓реЙрдЧрд┐рди рдкреЗрдЬ рдкрд░ "Oauth2" рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ response_type=code рдЬрд╝рдореНрдордж рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдпрд╣ рдореЗрд░реЗ OAuth рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИ ??

рдореИрдВ рджреЗрдЦ рд▓реВрдВрдЧрд╛

рд╣рд╛рдп @ThePatzen - рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдореИрдВ OAuth2 рдкреНрд░рджрд╛рддрд╛ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрдкрдХреЗ рдЬреИрд╕реЗ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ: #775

рдХреНрдпрд╛ рдЖрдк Django OAuth2 рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣рд╛рдВ @firlewapz рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВред

рд╣рд╛рдп @thorsteneckel - рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ! рдирд╣реАрдВ, рдореИрдВ рдЗрд╕ рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред рдореИрдВрдиреЗ OAuth2 рдиреЗрдЯрд┐рд╡ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╕рдордЭрддрд╛ рд╣реВрдБред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╛рдЦ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП /api/users/me рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП zammad рдХреЛрдб рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ?

рдУрд╣ рдореИрдВ рд╕рдордЭрд╛ред рд╣рд╛рдБ, рдареАрдХ рдпрд╣реА рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЖрдкрдХрд╛ рдкрд░рд┐рджреГрд╢реНрдп рд╕рд╣реА рд▓рдЧреЗ рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рджреВрд╕рд░реЗ рдЕрдВрдХ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЬрд╝рдорд╛рдж рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП /api/users/me URL рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛?

рдкреАрдПрд╕: рдЕрдЪреНрдЫрд╛ - рдЗрд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛

рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ OAuth2 рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реБрдХрдЕрдк рдпреВрдЖрд░рдПрд▓" рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ /vendor/lib/oauth2_database.rb рдЗрд╕ рддрд░рд╣ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

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

рдХреНрдпрд╛ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛? рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдФрд░ #775 рдХреЛ рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд░рдгрдиреАрддрд┐ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдирдорд╕реНрддреЗ!

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рд░реНрдпрд╛рд▓рдп рд╕реЗ рдмрд╛рд╣рд░ рд╣реВрдВред рдореИрдВ рдХрд▓ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЬреИрд╕реЗ рд╣реА рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреВрдВрдЧрд╛!

рдСрд╕реНрдЯреНрд░рд┐рдпрд╛ рд╕реЗ рд▓рд╛рд▓рдЪ!

рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ - рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВ ЁЯдУ рдмрд░реНрд▓рд┐рди рд╕реЗ рдСрд╕реНрдЯреНрд░рд┐рдпрд╛ рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ

рдирдорд╕реНрддреЗ! рдЗрд╕ рддрд░рд╣ рд▓реЙрдЧрд┐рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

!рд▓реЗрдХрд┐рди!: рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ! рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдХрд┐рд╕реА рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ!

  • рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ *: рдореИрдВ рдЕрднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВред рдЕрдм рд╕рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдЕрдиреБрд╢рдВрд╕рд╛:
рдореИрдВ рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛:

  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реБрдХрдЕрдк рдХреЗ рд▓рд┐рдП URL
  • рдИрдореЗрд▓ рдХреЗ рд▓реБрдХрдЕрдк-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдбрдирд╛рдо
  • рд▓реЙрдЧрд┐рди рдХреЗ рд▓реБрдХрдЕрдк-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдбрдирд╛рдо
  • рдкреНрд░рдердо рдирд╛рдо рдХреЗ рд▓реБрдХрдЕрдк-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдбрдирд╛рдо
  • рдЕрдВрддрд┐рдо рдирд╛рдо рдХреЗ рд▓реБрдХрдЕрдк-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдбрдирд╛рдо
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдХреЗ рд▓реБрдХрдЕрдк-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдбрдирд╛рдо рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛:
`рд╡рд░реНрдЧ Oauth2Database < OmniAuth::Strategies::OAuth2
рд╡рд┐рдХрд▓реНрдк: рдирд╛рдо, 'oauth2'

рдбреАрдИрдПрдлрд╝ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ (рдРрдк, * рдЖрд░реНрдЧреНрд╕, рдФрд░ рдмреНрд▓реЙрдХ)
# рдбреЗрдЯрд╛рдмреЗрд╕ рд▓реБрдХрдЕрдк
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)
рдЙрддреНрддрдо
рд╕рдорд╛рдкреНрдд

рдбреАрдИрдПрдлрд╝ рдХреЙрд▓рдмреИрдХ_рдпреВрдЖрд░рдПрд▓
full_host + script_name + рдХреЙрд▓рдмреИрдХ_рдкрде
рд╕рдорд╛рдкреНрдд

рдпреВрдЖрдИрдбреА {raw_info [рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ['user_info_id']]}

рдЬрд╛рдирдХрд╛рд░реА рджреЛ
{
рдИрдореЗрд▓: raw_info [рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ['user_info_email']],
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо: raw_info [рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ['user_info_username']],
рд▓реЙрдЧрд┐рди: raw_info [рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ['user_info_login']],
first_name: raw_info [рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ['user_info_firstname']],
last_name: raw_info [рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди ['user_info_lastname']],
}
рд╕рдорд╛рдкреНрдд

рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд░реЛ
{
'рд░реЙ_рдЗрдиреНрдлреЛ' => рд░реЙ_рдЗрдиреНрдлреЛ
}
рд╕рдорд╛рдкреНрдд

def raw_info
@raw_info ||= access_token.get(config['user_info_url']).parsed
рд╕рдорд╛рдкреНрдд

рдЕрдВрдд `

рдЖрдкрдХреЛ рдирд┐рдореНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  • user_info_id
  • user_info_email
  • user_info_login
  • user_info_firstname
  • user_info_lastname
  • рдПрдЯреА рд╕реЗ рд╕рд╛рджрд░!
    рдбреЗрд╡рд┐рдб

рдЕрдЪреНрдЫрд╛! рдкреНрд░рддрд┐рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред Omniauth рдХреЛрдб рдФрд░ рд╣рдорд╛рд░реЗ рдкрд░ рдореЗрд░реА рдПрдХ рдФрд░ рдирдЬрд╝рд░ рдереАред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА authorizations рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдпрд╛ рд░реЗрд▓ рдХрдВрд╕реЛрд▓ Authorization.all рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдирд╣реАрдВ рддреЛ рдЖрдкрдХрд╛ uid рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдпрдж рдЧреБрдо рд╣реИред

рд╣рдордиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рд╕рдВрдкреВрд░реНрдг OAuth2 рдЪреАрдЬрд╝ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдкреБрдирд░реНрд░рдЪрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реА рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рдФрд░ рдЬрд░реВрд░реА рдХрд╛рдо рд╣реИрдВред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦреВрдВрдЧрд╛ред

рдирдорд╕реНрддреЗ!

рд╣рд╛рдБ рдЕрдм рдкреНрд░рд╛рдзрд┐рдХрд░рдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ!
рдореЗрд░реЗ рд▓рд┐рдП рдЕрдм рдПрд▓реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! (рдореЗрд░реЗ рдмрджрд▓реЗ рд╣реБрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

:-) рдЗрдВрд╕рдмреНрд░реБрдХ, рдСрд╕реНрдЯреНрд░рд┐рдпрд╛ рд╕реЗ рд▓рд╛рд▓рдЪ :-)

рдЕрдЪреНрдЫрд╛! рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХреЗрдВ / рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЖрдкрдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ?

рдмрд░реНрд▓рд┐рди рд╕реЗ рдЗрдВрд╕рдмреНрд░реБрдХ рдХреЛ рдмрдзрд╛рдИ

рдирдорд╕реНрддреЗ! рдЬрдмрд╛рдм рдореЗрдВ рджреЗрд░реА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛! рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ:

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

рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ /рд╡рд┐рдХреНрд░реЗрддрд╛/lib/oauth2_database.rb рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛!

рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ "raw_info" рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде url/api/me рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреА рд╣реЛрдЧреАред

рдпрджрд┐ рдХрд┐рд╕реА рд╕реЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рд╣реИ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдкреВрдЫреЗрдВ :-)

рдирд┐рдЗрдЗрдЖрдЗрдЗрд╕! рдзрдиреНрдпрд╡рд╛рдж @ThePatzen! рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕реБрдзрд╛рд░ рджрд┐рдпрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрдВрджред рдЕрдкрдиреЗ рдЪрдордХрджрд╛рд░ рдирдП Zammad OAuth2 рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рдореБрдЭреЗ рдкрд╣рдЪрд╛рди рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ wso2is рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ "/ api/me" рдкрде рдЬрд╝рдордж рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, "/ api/users/me" рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ рдЬреИрд╕реЗ рдЕрдВрдХ 775 рдореЗрдВ рд▓рд┐рдЦрдирд╛ред рдЬрд╝рдордж рдХреЗрд╡рд▓ renspond рдкрд░ "/api/v1/users/me" рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдореИрдВрдиреЗ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛... рд▓реЗрдХрд┐рди рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдлрд┐рд░ рд╕реЗ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рд╣реВрдВ... рдХреГрдкрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ!

рдореИрдВ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди wso2is рдХреЗ рд╕рд╛рде def raw_info рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реВрдВ:

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
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

MBekspert picture MBekspert  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

martini picture martini  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sstidl picture sstidl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

robwilc picture robwilc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alveolus picture alveolus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ