在我的应用程序中,我有一个屏幕,用户单击不同类型的文件来查看和下载它们。然而,只有用户通过网站登录后才能访问此屏幕。
我使用以下方法用我的URL启动Safari浏览器:
UIApplication.sharedApplication().openURL(NSURL(string: url)!)
然而,用户被重定向到登录屏幕,因为他还没有被授权使用该网站。
我的问题是,如何将cookie或header传递到Safari并使用它们启动URL ?
你不能直接这么做。openURL
只是这样做的,没有更多。
您需要在URL中传递所需的凭据。目标服务器可以从URL中读取它们,然后在响应中设置所需的cookie。
如果你实现了,确保它不会被滥用来设置任意cookie或执行会话固定攻击。一种安全实现方法是使用一次性标识符:
- 在iOS应用中,使用一个有效的验证cookie联系服务器,并请求一个一次性的长随机密钥,服务器需要存储一段时间。
- 用
?key=<that one-time key>
将用户重定向到URL - 让服务器验证密钥匹配并为用户设置cookie,并删除密钥。
在URL查询中传递任何安全数据都要小心,因为这被认为是一种安全风险。
原因如下:
- url存储在web服务器日志
- url存储在浏览器历史记录
- url在Referrer header 中传递
参考:https://blog.httpwatch.com/2009/02/20/how-secure-are-query-strings-over-https/
我知道这不是你想要的,但是更安全的解决方案将是与WKWebView一起使用会话级cookie。查看此SO答案获取更多信息https://stackoverflow.com/a/26577303/14009088