1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| import json, time, base64, hashlib
class SsoTokenService: ENCODING = "utf-8" PUBLIC_KEY_STR = """-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----""" PRIVATE_KEY_STR = """-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"""
def execute(self, **kwargs): """主执行逻辑""" DEFAULT_URL = "https%3A%2F%2Fwww.example.com%2Fportal..." target_url = kwargs.get("return_url") or DEFAULT_URL
payload_dict = { "iss": kwargs.get("iss", "default_iss"), "sub": kwargs.get("sub", "user@email.com"), "aud": kwargs.get("aud", "tenant_id"), "exp": str(int(time.time()) + 900), "iat": str(int(time.time())), "cls": kwargs.get("cls", {"appid": "100"}) } kid = hashlib.sha256(self.PUBLIC_KEY_STR.replace("\n", "").replace("\r", "").encode()).hexdigest() header_json = json.dumps({"alg": "RS256", "kid": kid}, separators=(',', ':')) payload_json = json.dumps(payload_dict, separators=(',', ':'))
id_token = self._generate_id_token(header_json, payload_json) return f"https://sso.example.com/Auth?id_token={id_token}&return_url={target_url}"
def _generate_id_token(self, header_str, payload_str): """ [核心算法] 复刻 Java 非标 JWT 生成流程 """ std_h = base64.b64encode(header_str.encode()).decode() std_p = base64.b64encode(payload_str.encode()).decode() sign_content = f"{std_h}.{std_p}" std_sig = self._sign_rsa_manual(sign_content) to_safe = lambda s: s.replace('+', '-').replace('/', '_').replace('=', '') return f"{to_safe(std_h)}.{to_safe(std_p)}.{to_safe(std_sig)}"
def _sign_rsa_manual(self, content): """ [零依赖] 纯 Python 实现 RSA SHA256 签名 (s = m^d mod n) """ msg_hash = hashlib.sha256(content.encode()).digest() oid = b'\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20' m_int = int.from_bytes(padding, 'big') s_int = pow(m_int, d, n) return base64.b64encode(s_int.to_bytes(key_len, 'big')).decode()
|