Zammad: Oauth2 질문

에 λ§Œλ“  2017λ…„ 03μ›” 07일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: zammad/zammad

μ•ˆλ…•ν•˜μ„Έμš”!

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 및 만료 κ°’λ§Œ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

힌트λ₯Ό μ£Όμ‹œκ² μ–΄μš”?

μ˜€μŠ€νŠΈλ¦¬μ•„μ—μ„œ μ•ˆλΆ€!

  • λ°μ΄λΉ„λ“œ
question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ•ˆλ…• μ–˜λ“€μ•„!

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)에 λŒ€ν•΄ κ΅¬μ„±λ©λ‹ˆλ‹€. 그러면 둜그인 화면에 μ•„μ΄μ½˜μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. μ•„μ΄μ½˜/링크λ₯Ό ν΄λ¦­ν•˜λ©΄ μ‚¬μš©μžκ°€ omniauth URL둜 λ¦¬λ””λ ‰μ…˜λ©λ‹ˆλ‹€. κ·Έ ν›„ 자격 증λͺ…을 μˆ˜μ‹ ν•  λ•ŒκΉŒμ§€μ˜ λͺ¨λ“  것은 Zammad λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ³  omniauthμ—μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
OmniauthλŠ” URL을 λΉŒλ“œν•˜κ³  ν•„μˆ˜ OAuth2 λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μ‚¬μš©μžλ₯Ό κ³΅κΈ‰μžμ˜ μΌμΉ˜ν•˜λŠ” 둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€. κ±°κΈ°μ—μ„œ 인증이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
omniauth λ§€κ°œλ³€μˆ˜ 쀑 ν•˜λ‚˜λŠ” 콜백 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

μ΄λŸ¬ν•œ λ§€κ°œλ³€μˆ˜λŠ” Zammad에 ν•„μš”ν•˜λ©° κ³΅κΈ‰μžκ°€ μ œμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. 토큰 기반 인증은 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”!

λ‚˜λŠ” λ‹Ήμ‹ μ˜ 응닡을 μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

방금 μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.
! μ„€μ • / λ³΄μ•ˆ -> 일반 Oauth2 μ„€μ •. !

  1. 둜그인 νŽ˜μ΄μ§€μ—μ„œ OAuth2λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€.
  2. λ‚΄ λΈŒλΌμš°μ €λŠ” params client_id, client_secret, redirect_uri, response_type 및 stateλ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ성에 μ„€μ •λœ κΆŒν•œ λΆ€μ—¬ URL둜 λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€.
  3. 그런 λ‹€μŒ Oauthλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‘œκ·ΈμΈμ„ μˆ˜λ½ν•˜κ³  λ‚΄ μ„œλΉ„μŠ€ κ³΅κΈ‰μžκ°€ params μƒνƒœ 및 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ§€μ •λœ redirect_uri둜 λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€. (μΈμ¦μ½”λ“œ 맞죠?)
  4. ZammadλŠ” params client_id, client_secret, code, grant_type, redirect_uriλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬μ„±μ—μ„œ 토큰 URL에 λŒ€ν•œ λ°±κ·ΈλΌμš΄λ“œ μš”μ²­μ„ λ§Œλ“­λ‹ˆλ‹€. 이 κ²½μš°μ—λŠ” grant_type = authorization_codeμ΄λ―€λ‘œ access_token을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

이 μ›Œν¬ν”Œλ‘œλŠ” λ¬Έμ„œμ— 따라 달라야 ν•˜λŠ” 방식과 λ™μΌν•©λ‹ˆλ‹€.

λ‚˜λŠ” μš°λ¦¬κ°€ userdataλ₯Ό μ„€μ •ν•΄μ•Ό ν•  μœ„μΉ˜λ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

  • λ°μ΄λΉ„λ“œ

params μƒνƒœμ™€ μ½”λ“œλ‘œ. (μΈμ¦μ½”λ“œ 맞죠?)

이것이 μš”μ μž…λ‹ˆλ‹€. ZammadλŠ” 인증 μ½”λ“œκ°€ μ•„λ‹Œ μ‚¬μš©μž 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” ν•΄μ‹œ ꡬ쑰λ₯Ό κΈ°λŒ€ν•©λ‹ˆλ‹€. ν•΄μ‹œμ—λŠ” λ‹€μŒ ꡬ쑰가 ν•„μš”ν•©λ‹ˆλ‹€.
https://github.com/zammad/zammad/blob/c71b0d36d4fcefdaae4e39f1859094727a3ca74c/app/models/authorization.rb#L79

κ·€ν•˜μ˜ μš”μ  4.λŠ” λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ZammadλŠ” OAuth 둜그인이 μ„±κ³΅ν•œ ν›„ μ–΄λ– ν•œ μš”μ²­λ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·€ν•˜μ˜ μš”μ  4.λŠ” λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ZammadλŠ” OAuth 둜그인이 μ„±κ³΅ν•œ ν›„ μ–΄λ– ν•œ μš”μ²­λ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 포인트 4λŠ” λ‚΄ λ‘œκ·Έμ—μ„œ λ°œμƒν•˜λŠ” TOKEN_URL에 λŒ€ν•œ μš”μ²­μž…λ‹ˆκΉŒ?

  • 192.168.4.142 - - [07 / μ›” / 2017 : 14 : 33 : 23 +0100] "GET /oauth/authorize?client_id=0815&redirect_uri=http%3A%2F%2Fdomain.tld%2Fauth%2Foauth2%2Fcallback&response_type=code&state=97e53de9acb6f6a1b1af41a75dd65e8893e853c53bb64d1b HTTP/1.1" 302 840 " http://domain.tld/ " "Mozilla/5.0(Windows NT 6.1; Win64, x64) AppleWebKit/537.36(KHTML, 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 "-" "패러데이 v0.9.2"

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!: 맀번 μƒˆλ‘œμš΄ μ‚¬μš©μž 계정이 μƒμ„±λ©λ‹ˆλ‹€! 이미 μ‘΄μž¬ν•˜λŠ” λ‘œκ·ΈμΈμ€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€!

  • νŽΈμ§‘ *: 방금 μ‚¬μš©μž ID ν•„λ“œλ₯Ό μžŠμ–΄λ²„λ ΈμŠ΅λ‹ˆλ‹€. 이제 λͺ¨λ“  μž‘λ™ν•©λ‹ˆλ‹€!

μΆ”μ²œ:
λ˜ν•œ μ—¬λŸ¬ ν•„λ“œλ‘œ ꡬ성을 κ°œμ„ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

  • μ‚¬μš©μž 쑰회λ₯Ό μœ„ν•œ URL
  • 이메일 쑰회-μ‘λ‹΅μ˜ ν•„λ“œ 이름
  • 둜그인의 쑰회-μ‘λ‹΅μ˜ ν•„λ“œ 이름
  • 이름 쑰회 μ‘λ‹΅μ˜ ν•„λ“œ 이름
  • μ„±μ˜ 쑰회 μ‘λ‹΅μ—μ„œ ν•„λ“œ 이름
  • μΆ”κ°€λœ μ‚¬μš©μž ID의 쑰회-응닡에 ν•„λ“œ 이름

λ‹€μŒ μ½”λ“œλ₯Ό μΆ”μ²œν•©λ‹ˆλ‹€.
`클래슀 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
끝

끝`

λ‹€μŒ ꡬ성 ν•„λ“œκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

  • user_info_id
  • user_info_email
  • user_info_login
  • user_info_firstname
  • user_info_lastname
  • ATμ—μ„œ μ•ˆλΆ€!
    λ°μ΄λΉ„λ“œ

멋진! ν”Όλ“œλ°±μ„ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 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
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰