我打算将应用程序从旧的OAuth流程切换SFSafariViewController到iOS 11的新流程SFAuthenticationSession.登录不是问题,转移到新API花了我几分钟来实现.然而,退出让我感到困惑.
怎么样?
我找不到任何想提供在文档中任何地方注销的选项.使用旧的SFSafariViewController来使cookie无效?不,他们不再共享了SFAuthenticationSession.一旦我重新启动身份验证会话,用户就会自动登录并且没有任何出路.那么如何启用退出?或者我只是忽略了一些完全明显的东西?
更新:我从技术意义上找到了一种"有效的方式",但它对用户来说是疯狂的:在注销页面上打开一个新的SFAuthenticationSession来清除cookie.但这意味着当注销警报视图时再次询问用户他是否想通过该服务登录.如果是选择了("登录"),该cookie清算注销页面被打开时,用户必须手动关闭该视图,可以通过完成处理程序捕获,我们知道我们可以再次打开登录查看..显示登录提示退出?我真的不喜欢这个解决方案.
有任何想法吗?我还在忽视一个完全明显的解决方案吗?
更新2:由于到目前为止没有人对这个问题有任何线索,这可能不是一件容易的事.我已经通过他们的报告工具向Apple提出了一个建议,要么澄清如何处理这个问题,要么将其构建到API中(如果不可用).如果我得到答案,将发布.
更新3:在仔细思考问题之后,如果您可以影响OAuth提供程序的登录页面,我们会发现另一种可能的(虽然也没有吸引力)解决方案:使cookie非常短暂.然后可以在不自动登录的情况下打开登录页面.但是这会破坏在应用程序之间共享登录会话的全部目的..并且您需要能够影响登录页面.
更新4:因为iOS 12 SFAuthenticationSession已被弃用并被替换为ASWebAuthenticationSession.但是ASWebAuthenticationSession,在注销方面没有任何改变.它仍然不可能.和以前一样的问题.
在iOS 11上,Apple推出了一种在Web和移动应用程序之间共享身份验证数据的新方法SFAuthenticationSession.
SFAuthenticationSession向每个新用户(可能从未使用过我的网站)显示提示,让他们同意然后从中获取任何内容并要求他们登录将是一个糟糕的用户体验.
有没有办法知道在显示SFAuthenticationSession提示之前是否有可用的cookie ?或者,通过Associated Domains启用,在使用我的域进行身份验证时,系统不应显示提示?
我正在使用SFAuthenticationSession身份验证通过OAuth2.
用户必须同意的同意将以下消息显示为警报:
"[Xcode-Project-Name]"想要使用"[Server-URL]"登录.这允许应用和网站共享有关您的信息.
为什么不提及应用程序显示名称?
它是App Store提交后的App名称吗?
我正在尝试实施一种从 Safari 和 App 交换 cookie 的方法。我正在使用,SFAuthenticationSession因为 cookie 共享被禁用。我通读了这个主题,似乎这是实现这一目标的最佳解决方案。没有太多的博客或回购作为例子。
我已经在服务器端实现了以下更改重定向。
首先,我将 cookie 存储为https://example.com/?cookie=12345. 然后从应用程序我开始一个身份验证会话指向https://example.com/getcookie重定向到customapp://dummy/cookies?cookie=12345
曾经说过这一点。快速实现如下(多亏了这个):
let callbackUrl = "customapp://dummy/cookies"
let authURL = "https://example.com/getcookie"
self.authSession = SFAuthenticationSession(url: URL(string: authURL)!, callbackURLScheme: callbackUrl, completionHandler: { (callBack:URL?, error:Error? ) in
guard error == nil, let successURL = callBack else {
return
}
let cookie = self.parseQuery(url: (successURL.absoluteString), param: "cookie")
print(cookie!)
})
self.authSession?.start()
Run Code Online (Sandbox Code Playgroud)
您可能会注意到我对登录不感兴趣,而是对之前存储的 cookie 感兴趣。
任何人都可以请教吗?我的问题是,虽然站点正在重定向,但未调用完成处理程序,因此我无法解析回调 url。
更新
我发现我在Info.plist. 在向其添加自定义协议后,将调用处理程序。尽管如此,处理程序仅在我第二次参与身份验证会话时才被调用。
有什么线索吗?
我正在验证我们的 Web 服务ASWebAuthenticationSession,出于某种原因,最终重定向后的唯一选项是Cancel。我之前有过这个工作,即使我确实按下了取消,回调 Url 也是通过完成处理程序发送的,我能够在那里解析令牌形式。但现在我得到了错误ASWebAuthenticationSessionErrorCodeCanceledLogin。
如何ASWebAuthenticationSession显示“完成”按钮并使用回调 Url 完成处理程序?上次 iOS 更新中有什么变化或中断吗?
if (@available(iOS 12.0, *)) {
self.session = [[ASWebAuthenticationSession alloc]
initWithURL:@"http://service.com"
callbackURLScheme:@"http://website.com"
completionHandler:_sessionHandler];
[self.session start];
}
Run Code Online (Sandbox Code Playgroud)
_sessionHandler = ^(NSURL * _Nullable callbackURL, NSError * _Nullable error) {
NSLog(@"Callback Url: %@, Error: %@", callbackURL, error);
if ( callbackURL != nil ) {
__block NSString * token = [weakSelf webToken:@"token" fromUrl:callbackURL];
weakSelf.completionHandler([weakSelf parseWebToken:token], error);
}
else
weakSelf.completionHandler(nil, error);
};
Run Code Online (Sandbox Code Playgroud)
回调 …
single-sign-on sfsafariviewcontroller sfauthenticationsession aswebauthenticationsession
我知道SFSafariViewController有私人 cookie 存储和其他实现。但是,我知道我们可以为每个(每个本地系统)Swift 类编写一个扩展。我需要与本机 Safari 共享 cookie,或者Safari使用一些标头请求从我的应用程序打开。至少,如何创建一个API用于获取/设置 cookie 的?
safari ios swift sfsafariviewcontroller sfauthenticationsession