问题标签 [sfauthenticationsession]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 与 Safari 同步 - SFSafariViewController 的扩展
我知道它SFSafariViewController
有私有 cookie 存储和其他实现。但是,我知道我们可以为每个(每个本机系统)Swift 类编写一个扩展。我需要与本机 Safari 共享 cookie,或者Safari
通过一些标头请求从我的应用程序中打开。至少,如何创建一个API
用于获取/设置cookies?
ios - 在 iOS 11 中使用 SFAuthenticationSession 创建 SSO
我正在开发两个 iOS 应用程序,它们共享相同的钥匙串令牌,当用户通过在 Web 视图中输入用户名和密码登录其中一个应用程序时,它们会收到这些令牌。保存在钥匙串中的令牌有几个小时/几天的时间限制 - 当用户使用应用程序并发出请求/输入正在浏览器中打开的项目时,它们会被刷新。
在 iOS 11 发布之前,应用程序中的 web 视图是一个 SFSafariViewController 实例,这非常方便,因为它在应用程序之间共享 cookie,并且一旦用户在一个应用程序中登录浏览器,他就会自动登录-in 在其他应用程序中,从而实现 SSO 体验。
在 iOS 11 中,SFSafariViewController 的行为发生了变化,它不再在我的两个应用程序中的不同 SFSafariViewController 实例之间共享 cookie。相反,Apple 希望我们使用 SFAuthenticationSession 来实现相同的行为。
在我的应用程序中,我有一个大约 50 行的表格,几乎所有表格都在 SFSafariViewController 中打开不同的 URL。所以现在,在 iOS 11 中,我每次都需要创建一个新的 SFAuthenticationSession 实例(一旦创建实例就不能更改 URL),为了真正显示 web 视图,我需要调用 start() 方法在这个实例上。但是,这个方法只能在同一个实例上调用一次(否则它会返回'false'并且什么都不做),并且每次调用它都会弹出“myapp”要使用“mydomain.com”的通知登录。所以这意味着我的用户在每次点击表格中的一行时都会看到此警报消息。
有没有办法让我的应用程序只显示一次同意警报消息,例如第一次或其他什么?我希望我的用户在我的两个应用程序中拥有 SSO 体验,这就是我首先使用 SFSafariViewController 的原因,但我不希望他们在每次点击应用程序时都看到这个烦人的警报。
ios - SFAuthenticationSession/ASWebAuthenticationSession 和注销
我计划将应用程序从带有 的旧 OAuth 流程切换SFSafariViewController
到带有 iOS 11 的新流程SFAuthenticationSession
。登录不是问题,转移到新 API 花了我几分钟时间来实现。但是注销让我感到困惑。
如何?
我找不到任何提及想要在文档中的任何位置提供注销选项的内容。使用旧SFSafariViewController
的使cookies无效?不,它们不再与SFAuthenticationSession
. 一旦我重新启动身份验证会话,用户就会自动登录并且没有出路。那么如何启用注销呢?还是我只是忽略了一些完全明显的东西?
更新:我发现了一种技术意义上的“有效方式”,但它对用户来说很疯狂:在清除 cookie 的注销页面上打开一个新的 SFAuthenticationSession。但这意味着在注销时,警报视图会再次询问用户是否愿意通过该服务登录。如果选择是(“登录”),则打开 cookie 清除注销页面,用户必须手动关闭视图,这可以被完成处理程序捕获,我们知道我们可以再次打开登录视图.. 显示登录提示退出?我真的不喜欢这个解决方案。
有任何想法吗?我是否仍然忽略了一个完全明显的解决方案?
更新 2:由于到目前为止没有人对此问题有任何线索,这可能不是一件容易的事。我已经通过他们的报告工具向 Apple 提交了一个建议,以阐明如何处理此问题或将其构建到 API 中(如果不可用)。如果我得到答案,将发布。
更新 3:在进一步思考这个问题后,我们发现了另一种可能的(虽然也没有吸引力)解决方案,如果您可以影响 OAuth 提供程序的登录页面:使 cookie 的寿命很短。然后登录页面可以在没有自动登录的情况下打开。但是这会破坏在应用程序之间共享登录会话的整个目的......并且您需要能够影响登录页面。
更新 4:由于 iOS 12SFAuthenticationSession
已被弃用并被ASWebAuthenticationSession
. 但是ASWebAuthenticationSession
,在注销方面没有任何改变。这仍然是不可能的。和以前一样的问题。
ios - 为什么 SFAuthenticationSession 每次都提示同意?
我正在SFAuthenticationSession
使用SSO和OAuth。
调用该start()
方法时,iOS 会弹出一个同意对话框,要求用户允许应用程序使用OAuth提供程序。每次启动身份验证会话时都会出现同意弹出窗口。
这是设计使然吗?它似乎应该出现一次,就像其他同意对话框一样。
ios - SFAuthenticationSession 是否在应用程序之间共享 cookie
我正在使用单点登录 (SSO) 让用户登录 iOS 应用程序。我使用 SFAuthenticationSession 实现了 SSO。我创建了另一个应用程序并实现了使用相同登录 URL 的相同 SSO 机制。我期待这两个应用程序将共享相同的 SFAuthenticationSession cookie,以便用户在成功登录第一个应用程序后不会在第二个应用程序中再次输入密码。不共享cookies是SFAuthenticationSession的正常行为吗?如果是,这意味着不可能使用 SFAuthenticationSession 实现 SSO 机制?使用普通的 webviews 会解决这个问题吗?我在论坛上找到了一个类似的主题,但问题是在 ios 11 beta 上遇到的。也许问题在此期间解决了?
ios - SFSafariViewController 的 SSO 体验
在SFSafariViewController描述中写道
您将使用 SFAuthenticationSession 的两种情况是:
使用身份验证协议(例如 OAuth)登录第三方服务。此选项适用于社交网络应用程序。
为应用程序提供单点登录 (SSO) 体验。此选项适用于在同一设备上安装了许多应用程序的企业公司。
我想实现第二种情况。我有不同的应用程序并使用 SFSafariViewController 来实现 SSO。问题是在我的测试中,cookie 没有在不同的应用程序之间共享。我登录了一个应用程序,然后当我尝试使用相同的登录 URL 登录另一个应用程序时,我必须再次写入我的凭据,即使会话在第一个应用程序中仍然处于活动状态。这是正常的行为吗?如果我的应用程序之间没有共享 cookie,我应该如何实现 SSO 体验?
oauth - iOS 11 AppAuth 处理重定向的重定向 URI
在我的 iOS 应用程序(特别是 iOS 11 )上使用AppAuth (v 0.90.0)进行 Google OAuth 身份验证时,会发生以下情况:
- 使用重定向 URI 在 iOS 客户端上启动 Google 身份验证
http://myproduct.com/oauth-redirect
。因为客户端 ID 是 Web 应用程序的 ID,所以我无法指定自定义 URL。 - AppAuth 在客户端启动 SFAuthenticationSession,系统提示我允许登录。选择继续。(https://github.com/openid/AppAuth-iOS/blob/0.90.0/Source/iOS/OIDAuthorizationUICoordinatorIOS.m#L91-L95)
http://myproduct.com/oauth-redirect
重定向到自定义 URLmyproduct://auth
,并且 SFAuthenticationSession 完成块使用回调 URL 运行myproduct://auth
。- 当 AppAuth 恢复身份验证流程时,它会检查原始 URL 是否与上一步中的回调 URL 相同:https ://github.com/openid/AppAuth-iOS/blob/0.90.0/Source/OIDAuthorizationService.m #L108-L110
- 因为
http://myproduct.com/oauth-redirect
和myproduct://auth
不同,所以流动停止。
请注意,我正在使用 Web 应用程序 clientID,以便我可以在服务器端执行令牌交换。
在以前的 AppAuth 版本中,这是可能的,因为我能够resumeAuthorizationFlowWithURL
直接使用更新后的 URL 进行调用。
有没有办法支持这个用例而无需更新 AppAuth?