From 8a80094cc28081486413eb0d9dce39dda52a0ba2 Mon Sep 17 00:00:00 2001 From: Moonjunhyeon <84641360+moon-jun@users.noreply.github.com> Date: Thu, 10 Apr 2025 16:43:00 +0900 Subject: [PATCH] Update oic_session.rb fix: JWT Token Json Parsing Error At using Korean, Turkish...else purpose 1. JWT use Base 64 URL encoding So, Before Base 64 Decoding URL-safe character(-, _) should change to (+, /) 2. Including korean JWT payload is Json string That encoding by UTF-8 So, ByteArray Decoded by Base64 should change to UTF-8 String 3. Finally payload is Json So, Parsing And return To JS Object --- app/models/oic_session.rb | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/models/oic_session.rb b/app/models/oic_session.rb index dba5071..9c36e9e 100644 --- a/app/models/oic_session.rb +++ b/app/models/oic_session.rb @@ -157,7 +157,16 @@ def authorized? return false end - + + def decode_jwt_payload(payload_encoded) + # Add missing padding (JWT may omit padding) + remainder = payload_encoded.length % 4 + if remainder > 0 + payload_encoded += "=" * (4 - remainder) + end + Base64.urlsafe_decode64(payload_encoded).force_encoding("UTF-8") + end + def admin? if client_config['admin_group'].present? if user["member_of"].present? @@ -174,11 +183,19 @@ def admin? end def user - if access_token? # keycloak way... - @user = JSON::parse(Base64::decode64(access_token.split('.')[1])) - else - @user = JSON::parse(Base64::decode64(id_token.split('.')[1])) + begin + payload_encoded = if access_token? + access_token.split('.')[1] + else + id_token.split('.')[1] + end + decoded_payload = Base64.decode64(payload_encoded).force_encoding("UTF-8") + + @user = JSON.parse(decoded_payload) + rescue JSON::ParserError => e + raise e end + return @user end