OIDC 和 PWA(添加到主屏幕)
OIDC and PWA (add to home screen)
更新:与 基本相同的问题,但在 iOS.
如果您将 Web 应用程序添加到主屏幕,android 上的 Chrome 会与浏览器中的同一域共享本地存储。您可以通过转到 https://wilfrem.github.io/add_to_homescreen_test/ 然后添加到主屏幕来测试它,并在从主屏幕打开时看到您有相同的 ID。 (我用的是 Nexus 5x)
如果您在 iOS Safari 中执行相同操作,您将获得一个新 ID。 (我做了 iPod iOS 12.1.1)
oidc-client-js 库在本地存储中设置会话引用,然后在 Web 应用程序中调用它
s 登录回调。因此,如果您尝试从 iOS 主屏幕打开的 Web 应用程序登录,它会在 Safari 中打开 OP(oidc 提供程序),然后重定向回 Web 应用程序的 url,但在 Safari 中不会从主屏幕 Web 应用程序打开,因此由于本地存储不同,您将获得:
No matching state found in storage
如果本地存储不在同一个域中共享,您应该如何将 oidc 与从主屏幕 Web 应用程序打开的 iOS 一起使用?或者如何让 iOS 在重定向回 Web 应用程序时重新打开正确的 window(从主屏幕打开的那个)?或者如何让 iOS 在首先导航到 OP(oidc 提供程序)时永远不会离开全屏应用程序?
编辑:
这里用一段话来解释这个问题。
- 打开
my.app.com
- 添加到主屏幕
- 从主屏幕打开应用程序
- 点击登录按钮
- 登录按钮调用
UserManager.signinRedirect()
UserManager.signinRedirect()
呼叫 OidcClient.createSigninRequest()
OidcClient.createSigninRequest()
在 localstorage 中存储登录状态并导航到 my.op.com
see on android my.op.com
打开一个 Chrome 选项卡并在 iOS my.op.com
上打开 Safari
- 操作完成登录过程
- op 重定向到
my.app.com/signin-callback.html
这是问题所在
android my.app.com/signin-callback.html
在从主屏幕打开的应用程序中打开,在 iOS 它留在 Safari 中。所以你得到:
No matching state found in storage
我对这个错误没有任何困难,根据发生的情况,这个错误是完全可以预料的,我只是不知道如何让 Safari 以一种可以与库一起工作的方式运行。
如果相关,这是我的 manifest.json
{
"name": "omitted",
"short_name": "omitted",
"theme_color": "#omitted",
"background_color": "#omitted",
"display": "standalone",
"scope": "/",
"start_url": "/",
"icons": [
{
"src": "omitted",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "omitted",
"sizes": "512x512",
"type": "image/png"
}
]
}
add 也删除了 scope
但在行为上没有任何变化。
更新:
还尝试将开始设置为完整域,而不仅仅是相对域 /
,仍然没有变化。
我已经遇到过这个问题,它帮助了我。
看看有没有!
更新:与
如果您将 Web 应用程序添加到主屏幕,android 上的 Chrome 会与浏览器中的同一域共享本地存储。您可以通过转到 https://wilfrem.github.io/add_to_homescreen_test/ 然后添加到主屏幕来测试它,并在从主屏幕打开时看到您有相同的 ID。 (我用的是 Nexus 5x)
如果您在 iOS Safari 中执行相同操作,您将获得一个新 ID。 (我做了 iPod iOS 12.1.1)
oidc-client-js 库在本地存储中设置会话引用,然后在 Web 应用程序中调用它 s 登录回调。因此,如果您尝试从 iOS 主屏幕打开的 Web 应用程序登录,它会在 Safari 中打开 OP(oidc 提供程序),然后重定向回 Web 应用程序的 url,但在 Safari 中不会从主屏幕 Web 应用程序打开,因此由于本地存储不同,您将获得:
No matching state found in storage
如果本地存储不在同一个域中共享,您应该如何将 oidc 与从主屏幕 Web 应用程序打开的 iOS 一起使用?或者如何让 iOS 在重定向回 Web 应用程序时重新打开正确的 window(从主屏幕打开的那个)?或者如何让 iOS 在首先导航到 OP(oidc 提供程序)时永远不会离开全屏应用程序?
编辑:
这里用一段话来解释这个问题。
- 打开
my.app.com
- 添加到主屏幕
- 从主屏幕打开应用程序
- 点击登录按钮
- 登录按钮调用
UserManager.signinRedirect()
UserManager.signinRedirect()
呼叫OidcClient.createSigninRequest()
OidcClient.createSigninRequest()
在 localstorage 中存储登录状态并导航到my.op.com
see on androidmy.op.com
打开一个 Chrome 选项卡并在 iOSmy.op.com
上打开 Safari- 操作完成登录过程
- op 重定向到
my.app.com/signin-callback.html
这是问题所在
android my.app.com/signin-callback.html
在从主屏幕打开的应用程序中打开,在 iOS 它留在 Safari 中。所以你得到:
No matching state found in storage
我对这个错误没有任何困难,根据发生的情况,这个错误是完全可以预料的,我只是不知道如何让 Safari 以一种可以与库一起工作的方式运行。
如果相关,这是我的 manifest.json
{
"name": "omitted",
"short_name": "omitted",
"theme_color": "#omitted",
"background_color": "#omitted",
"display": "standalone",
"scope": "/",
"start_url": "/",
"icons": [
{
"src": "omitted",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "omitted",
"sizes": "512x512",
"type": "image/png"
}
]
}
add 也删除了 scope
但在行为上没有任何变化。
更新:
还尝试将开始设置为完整域,而不仅仅是相对域 /
,仍然没有变化。
我已经遇到过这个问题,它帮助了我。
看看有没有