μλ νμΈμ!
Oauth2 μλΉμ€λ₯Ό ꡬννκ³ μμΌλ©° μ΄λ₯Ό μ¬μ©νμ¬ Zammadμ λ‘κ·ΈμΈνκ³ μΆμ΅λλ€.
λͺ¨λ κ²μ΄ μ μλνμ§λ§ 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 λ° λ§λ£ κ°λ§ ν¬ν¨λμ΄μΌ ν©λλ€.
ννΈλ₯Ό μ£Όμκ² μ΄μ?
μ€μ€νΈλ¦¬μμμ μλΆ!
Zammadλ μ‘μΈμ€ ν ν° λ‘κ·ΈμΈ λ°©μμ μ§μνμ§ μμ΅λλ€. μλ΅ νμ΄λ‘λμ μ¬μ©μμ μ격 μ¦λͺ μ΄ νμν©λλ€.
ν°μΌ(#102057)μμ κ°μ Έμ΄:
λ€λ₯Έ 곡κΈμλ λ€μκ³Ό κ°μ΄ μλν©λλ€.
Zammadλ μΈμ¦ 곡κΈμ(μ: Github)μ λν΄ κ΅¬μ±λ©λλ€. κ·Έλ¬λ©΄ λ‘κ·ΈμΈ νλ©΄μ μμ΄μ½μ΄ νμλ©λλ€. μμ΄μ½/λ§ν¬λ₯Ό ν΄λ¦νλ©΄ μ¬μ©μκ° omniauth URLλ‘ λ¦¬λλ μ
λ©λλ€. κ·Έ ν μ격 μ¦λͺ
μ μμ ν λκΉμ§μ λͺ¨λ κ²μ Zammad λ²μλ₯Ό λ²μ΄λκ³ omniauthμμ μ²λ¦¬λ©λλ€.
Omniauthλ URLμ λΉλνκ³ νμ OAuth2 맀κ°λ³μκ° μλ μ¬μ©μλ₯Ό 곡κΈμμ μΌμΉνλ λ‘κ·ΈμΈ νμ΄μ§λ‘ 리λλ μ
ν©λλ€. κ±°κΈ°μμ μΈμ¦μ΄ μ΄λ£¨μ΄μ§λλ€.
omniauth 맀κ°λ³μ μ€ νλλ μ½λ°± URLμ
λλ€. μΈμ¦μ΄ μλ£λλ©΄ μ¬μ©μλ 곡κΈμμ μν΄ μ΄ URLλ‘ λ¦¬λλ μ
λ©λλ€. μ½λ°± URLμ κ²½λ‘ λͺ©λ‘μ ꡬμ±λμ΄ μμ΅λλ€.
κ²½λ‘λ μμ²μ μΈμ 컨νΈλ‘€λ¬λ‘ ν°λλ§νμ¬ μ¬μ©μλ₯Ό νμΈνκ±°λ μ°Ύμ μ μλ κ²½μ° μμ±νλ €κ³ μλν©λλ€.
μ¬κΈ°μμ μλ£λμμ΅λλ€.
μ΄λ¬ν 맀κ°λ³μλ Zammadμ νμνλ©° 곡κΈμκ° μ μΆν΄μΌ ν©λλ€. ν ν° κΈ°λ° μΈμ¦μ μ§μλμ§ μμ΅λλ€.
μλ νμΈμ!
λλ λΉμ μ μλ΅μ μ΄ν΄νμ§ λͺ»ν©λλ€.
λ°©κΈ μλνμ΅λλ€.
! μ€μ / 보μ -> μΌλ° Oauth2 μ€μ . !
μ΄ μν¬νλ‘λ λ¬Έμμ λ°λΌ λ¬λΌμΌ νλ λ°©μκ³Ό λμΌν©λλ€.
λλ μ°λ¦¬κ° userdataλ₯Ό μ€μ ν΄μΌ ν μμΉλ₯Ό μ΄ν΄νμ§ λͺ»ν©λλ€.
params μνμ μ½λλ‘. (μΈμ¦μ½λ λ§μ£ ?)
μ΄κ²μ΄ μμ μ
λλ€. Zammadλ μΈμ¦ μ½λκ° μλ μ¬μ©μ λ°μ΄ν°λ₯Ό ν¬ν¨νλ ν΄μ ꡬ쑰λ₯Ό κΈ°λν©λλ€. ν΄μμλ λ€μ κ΅¬μ‘°κ° νμν©λλ€.
https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L79
κ·νμ μμ 4.λ λ°μνμ§ μμμ΅λλ€. Zammadλ OAuth λ‘κ·ΈμΈμ΄ μ±κ³΅ν ν μ΄λ ν μμ²λ μννμ§ μμ΅λλ€.
κ·νμ μμ 4.λ λ°μνμ§ μμμ΅λλ€. Zammadλ OAuth λ‘κ·ΈμΈμ΄ μ±κ³΅ν ν μ΄λ ν μμ²λ μννμ§ μμ΅λλ€.
κ·Έλ¬λ ν¬μΈνΈ 4λ λ΄ λ‘κ·Έμμ λ°μνλ TOKEN_URLμ λν μμ²μ λκΉ?
oauth2λ₯Ό μ¬μ©ν μ¬μ©μ λ‘κ·ΈμΈμ λν΄ μ΄μΌκΈ°ν©λλ€.
response_type=code
λ Zammadμμ μ§μλμ§ μμ΅λλ€.
νμ§λ§ μ΄ response_type=code
λ λ‘κ·ΈμΈ νμ΄μ§μμ "Oauth2" λ²νΌμ λλ μ λ Zammadκ° μ€μ ν κ²μ
λκΉ?
λ΄ Oauth 곡κΈμκ° μ€μ νμ§ μμ΅λκΉ??
π€ λ΄μΌκ² λ€
μλ νμΈμ @ThePatzen - μ§μ°μ λν΄ μ£μ‘ν©λλ€. λλ OAuth2 μ 곡μ λΆλΆμμ μκ°μ 보λ΄κ³ λΉμ κ³Ό λ§€μ° μ μ¬ν λ¬Έμ λ₯Ό κ°μ§ λͺλͺ μ¬λλ€μ λ°κ²¬νμ΅λλ€: #775
Django OAuth2 ν΄ν·λ μ¬μ©ν©λκΉ? @firlevapz μμ μ 곡νλ ν΄κ²° λ°©λ²μ΄
μ¬λ¬λΆμ μ견μ κΈ°λ€λ¦¬κ² μ΅λλ€.
μλ νμΈμ @thorsteneckel - λ¬Έμ μμ΅λλ€! μλμ, μ λ μ΄ ν΄ν·μ μ¬μ©νμ§ μμ΅λλ€. OAuth2 λ€μ΄ν°λΈλ₯Ό ꡬννμ΅λλ€.
λ΄κ° μ λλ‘ μ΄ν΄ν©λκΉ? μ΄ ν΄κ²° λ°©λ²μ μ¬μ©μμ μ격 μ¦λͺ μ μ»κΈ° μν΄ /api/users/meμ λν λ³λμ μμ²μ μννλλ‘ zammad μ½λλ₯Ό λ³κ²½ν©λλ€.
μ κ² μ΄μ. λ€, λ°λ‘ κ·Έκ²μ΄ νλ μΌμ
λλ€. λλ λΉμ μ μλ리μ€κ° λ§λ€λ©΄ λΉμ μ΄ κ° μΌλ°μ μΈ λ°©λ²μ΄ λ μ μλ€κ³ μκ°ν©λλ€. λ€λ₯Έ λ¬Έμ μμ μΈκΈνλ―μ΄ μ°λ¦¬λ μ΄κ²μ Zammadμ μ μ©νλ €κ³ λ
Έλ ₯ν κ²μ
λλ€. μ 곡μ
체μ λν΄ /api/users/me
URLμ ꡬμ±ν μ μλ€λ©΄ κ·νμ μ¬λ‘μ μ μ©λ©λκΉ?
μΆμ : μ’μ΅λλ€ - λ€μ΄ν°λΈ ꡬν π€
λ΄ κ΄μ μμ OAuth2 λͺ¨λμλ "μ¬μ©μ μ‘°ν URL"μΈ μΆκ° κ΅¬μ± λ§€κ°λ³μκ° νμν©λλ€.
λν /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λ₯Ό ν΄κ²°νλ κ²μ΄ μ’μ΅λλ€.
μλ νμΈμ!
μ λ νμ¬ λΆμ¬μ€μ λλ€. λ΄μΌ ν μ€νΈν΄λ³΄κ³ λ°λ‘ λ΅λ³ λλ¦¬κ² μ΅λλ€!
μ€μ€νΈλ¦¬μμ νμ!
κ±±μ λ§μΈμ - μ°λ¦¬κ° μμ΅λλ€ π€ λ² λ₯Όλ¦°μμ μ€μ€νΈλ¦¬μλ‘ μΈμ¬λ립λλ€ π
μλ νμΈμ! μ΄λ κ² νλ©΄ λ‘κ·ΈμΈμ΄ μλν©λλ€!
!BUT!: λ§€λ² μλ‘μ΄ μ¬μ©μ κ³μ μ΄ μμ±λ©λλ€! μ΄λ―Έ μ‘΄μ¬νλ λ‘κ·ΈμΈμ λΆκ°λ₯ν©λλ€!
μΆμ²:
λν μ¬λ¬ νλλ‘ κ΅¬μ±μ κ°μ νλ κ²μ΄ μ’μ΅λλ€.
λ€μ μ½λλ₯Ό μΆμ²ν©λλ€.
`ν΄λμ€ Oauth2Database < OmniAuth::Strategies::OAuth2
μ΅μ
:μ΄λ¦, 'oauth2'
def μ΄κΈ°ν(μ±, *μΈμ, &λΈλ‘)
# λ°μ΄ν°λ² μ΄μ€ μ‘°ν
κ΅¬μ± = Setting.get('auth_oauth2_credentials') || {}
μΈμ[0] = ꡬμ±['μ±_ID']
μΈμ[1] = ꡬμ±['μ±_λΉλ°']
args[2][:client_options] = args[2][:client_options].merge(config.symbolize_keys)
κ°λ
μ
λ
def callback_url
μ 체 νΈμ€νΈ + μ€ν¬λ¦½νΈ μ΄λ¦ + μ½λ°± κ²½λ‘
λ
uid { raw_info[ꡬμ±['user_info_id']] }
μ 보
{
μ΄λ©μΌ: raw_info[config['user_info_email']],
μ¬μ©μ μ΄λ¦: raw_info[config['user_info_username']],
λ‘κ·ΈμΈ: raw_info[config['user_info_login']],
first_name: raw_info[config['user_info_firstname']],
last_name: raw_info[config['user_info_lastname']],
}
λ
μ¬λΆμ
{
'raw_info' => raw_info
}
λ
def raw_info
@raw_info ||= access_token.get(config['user_info_url']).parsed
λ
λ`
λ€μ κ΅¬μ± νλκ° νμν©λλ€.
λ©μ§! νΌλλ°±μ μ£Όμ
μ κ°μ¬ν©λλ€. Omniauth μ½λμ μ°λ¦¬μ μ½λλ₯Ό λ€μ μ΄ν΄λ³΄μμ΅λλ€. authorizations
λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ νλͺ©μ΄ μλμ§ νμΈν΄ μ£Όμκ² μ΅λκΉ? μ§μ μ‘μΈμ€ λλ Rails μ½μ 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
μ΄κ²μ /vendor/lib/oauth2_database.rb νμΌμ λ΄μ©μΌλ‘ μ€μ λμ΄μΌ ν©λλ€!
μ ν리μΌμ΄μ μ "raw_info"μ μ¬μ©λ λͺ¨λ νλμ ν¨κ» url /api/meλ‘ μλ΅μ μ 곡ν΄μΌ ν©λλ€.
μ§λ¬Έμ΄ μμΌμ λΆλ€μ μΈμ λ μ§ λ¬Έμμ£ΌμΈμ :-)
λμ΄μ΄μ€! @ThePatzen κ°μ¬ν©λλ€! μ½λλ₯Ό μ½κ° λ€μ ν¬λ§·νμ΅λλ€. μ§κΈμ λ¬Έμ λ«μ΅λλ€. λ°μ§μ΄λ μλ‘μ΄ Zammad OAuth2 μΈμ¦μΌλ‘ μ¦κ±°μ΄ μκ° λ³΄λ΄μΈμ π€
μλ νμΈμ μ¬λ¬λΆ, wso2isλ₯Ό ID μλ²λ‘ μ¬μ©νλ κ²κ³Ό λμΌν λ¬Έμ κ° μμ΅λλ€. λλ "/api/me" κ²½λ‘κ° zammadμμ μλ΅νμ§ μλλ€λ κ²μ μ΄ν΄νμ§ λͺ»ν©λλ€. "/api/users/me"μ λν΄μλ λ¬Έμ 775μμ μμ±νλ κ²κ³Ό λμΌν©λλ€. zammadμμλ "/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
κ°μ₯ μ μ©ν λκΈ
μλ μλ€μ!
wso2isκ° def raw_infoλ₯Ό λ€μκ³Ό κ°μ΄ λ³κ²½νλ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.