ServiceNow 重定向 URL 修剪到“&”字符

ServiceNow Redirect URL trimmed upto "&" character

我的 Web 应用程序重定向到 ServiceNow 应用程序并使用 SSO 登录。我希望用户 重定向到 ServiceNow 平台上的特定内容

Redirect URL: app?sys_kb_id=d34cecb01bdcd0102fsw&id=kb_article_view&sysparam_rank=1 &sysparam_tsqueryId=37ac2ea11b6689d4db49f2

我面临的问题是重定向 URL 被修剪为第一个参数。这是因为已经使用的workflow和&.

的用法

我们在ServiceNow中使用的工作流程如下,

logout --> login with sso --> auth redirect

此工作流很重要,因为客户端在共享硬件上使用 Web 应用程序。为防止跨用户访问,我们会在每次打开 ServiceNow 应用程序时注销当前用户。

注销请求

https://example.service-now.com/logout.do?glide_sso_id=<sso-id>&logout_first=true&sysparm_goto_url=%2Flogin_with_sso.do%3Fglide_sso_id%3D<sso-id>%26login_redirect_uri%3Dapp%3Fsys_kb_id%3Dd34cecb01bdcb0102f09986a23shak90%26id%3Dkb_article_view%26sysparm_rank%3D1%26sysparm_tsqueryId%3D37ac2ea11b6689d4db49f2ff034jls72
Payload:{
   sysparm_goto_url=%2Flogin_with_sso.do%3Fglide_sso_id%3D<sso-id>%26login_redirect_uri%3Dmyhr%3Fsys_kb_id%3Dd34cecb01bdcb0102f09986a23shak90%26id%3Dkb_article_view%26sysparm_rank%3D1%26sysparm_tsqueryId%3D37ac2ea11b6689d4db49f2ff034jls72
}

登录请求

https://example.service-now.com/login_with_sso.do?glide_sso_id=<sso-id>&login_redirect_uri=app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=37ac2ea11b6689d4db49f2ff034jls72
Payload: {
   login_redirect_uri=app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=37ac2ea11b6689d4db49f2ff034jls72
}

登录 API 解析重定向 URL,这导致编码的 URL 字符被解码。

由于重定向 URL 中的“&”字符,URL 分成单独的查询参数,

requiredRedirectUrl: app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=37ac2ea11b6689d4db49f2ff034jls72

actualRedirectUrl: app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90
++ id=kb_article_view
++ sysparm_rank=1
++ sysparm_tsqueryId=37ac2ea11b6689d4db49f2ff034jls72

由于重定向 URL 不完整,用户来到了着陆页而不是内容页。

RequiredEndUrl: https://example.service-now.com/app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=37ac2ea11b6689d4db49f2ff034jls72
ActualEndUrl: https://example.service-now.com/app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90

有什么方法可以确保重定向 URL 不被登录 API 解码?

或者有其他方法可以达到要求

我找到了解决办法。问题是注销 API 在调用登录 API 之前解码了重定向 URL,这导致了一个问题,因为像“&”这样的字符没有被转义。

我对重定向 URL 进行了两次编码(双重编码 URL),然后将其添加到注销请求中。有了这个,当 URL 最初被解码时,字符仍然保持转义,实际的重定向 URL 被发送到最后一个 API 调用。

Redirect URL: app?sys_kb_id=d34cecb01bdcb0102f09986a23shak90&id=kb_article_view&sysparm_rank=1&sysparm_tsqueryId=37ac2ea11b6689d4db49f2ff034jls72
Double Encoded URL: app%253Fsys_kb_id%253Dd34cecb01bdcb0102f09986a23shak90%2526id%253Dkb_article_view%2526sysparm_rank%253D1%2526sysparm_tsqueryId%253D37ac2ea11b6689d4db49f2ff034jls72