首页 文章

在本机应用和网站之间共享凭据

提问于
浏览
11

我正在处理的应用程序允许用户登录启用OAuth的后端 . 因此,应用程序仅对身份验证令牌和用户元数据有用,而不是用户的凭据 .

在应用程序中,用户可以点击在浏览器中打开链接的链接 . 这些资源也受OAuth保护,在登录本机应用程序期间获得的令牌也与Web相关 .

我希望用户的凭据以标准OAuth方式从本机应用程序流向Web浏览器(通过将其包含为 Authorization 标头) .

似乎Android通过其shared credentials功能促进了这一点,但我找不到iOS的等价物 . 我确实找到了shared web credentials功能,但这似乎需要了解用户的凭据 .

如何将OAuth令牌从我的原生应用程序流向它打开的Web浏览器?

4 回答

  • 12

    关联域和共享Web凭据在这里似乎不是一个好方法 .

    您有两种选择:

    • 将OAuth访问令牌作为URL-QueryString-Param传递给WebBrowser . https://x.y.z/?access_token=abc 您必须操纵嵌入的URL并确保您的后端了解这一点 . 非常常见且简单的方法 . Facebook和Google等许多网站都在URL中传递访问令牌 .

    • 如果您正在使用应用程序内浏览器(UIWebView,WKWebView),您可以截取URL-Request并自行添加授权 Headers . 对于UIWebView,请参阅this,对于WKWebView,请参阅this(这比UIWebView稍微难点)

  • 1

    首先你应该使用HTTPS协议 - 谷歌:让我们加密(以获得免费的SSL证书)

    你应该考虑的流程:

    • 用户打开您的移动应用程序,系统会提示您输入用户名或电子邮件和密码 .

    • 您使用用户的用户名或电子邮件和密码数据从您的移动应用程序向您的API服务发送POST请求(超过SSL!) .

    • 您验证用户凭据,并为在一定时间后过期的用户创建访问令牌 . (google for:api rate limiting)

    • 您将此访问令牌存储在移动设备上,将其视为API密钥,可让您访问API服务 .

    • 一旦访问令牌过期且不再有效,您将重新提示用户输入用户名或电子邮件和密码 .

    在服务器端,你应该使用诸如:fail2ban,iptables之类的东西,并确保你使用的linux版本是最新的 . (你应该不时更新/升级)

    在Web应用程序(api)上,您应该验证并序列化所有数据 . 永远不要发送所需的更多数据,也绝不接受来自客户端的部分数据 . 在api应用程序上,您应该执行xss(跨站点脚本)/ csrf(跨站点请求伪造)预防 . 看看OWASP TOP 10 - https://www.owasp.org/index.php/Top_10_2013-Top_10 . 您还应该在Web api上使用安全标头 - https://www.dionach.com/blog/an-overview-of-http-security-headers .

    绝不相信用户输入 .

  • 1

    从技术上讲,您可以在传递给浏览器的URI中包含令牌 .

    但这将是不安全的:

    访问令牌的注入当客户端从令牌 endpoints 的返回调用之外的来源接受访问令牌时,会发生另外(且非常危险)的威胁 . 对于使用隐式流的客户端(其中令牌直接作为URL哈希中的参数传递)并且未正确使用OAuth状态参数,可能会发生这种情况 . 如果应用程序的不同部分在组件之间传递访问令牌以便在它们之间“共享”访问,则也会发生此问题 . 这是有问题的,因为它为访问令牌开辟了一个可能被外部方注入应用程序的地方(并且可能在应用程序之外泄漏) . 如果客户端应用程序未通过某种机制验证访问令牌,则无法区分有效令牌和攻击令牌 . (来源:https://oauth.net/articles/authentication/)

    它在规范中也是禁止的:

    访问令牌凭证(以及任何机密访问令牌属性)必须在传输和存储中保密,并且仅在授权服务器,访问令牌有效的资源服务器以及访问令牌所针对的客户端之间共享 . 发行 . (来源:https://tools.ietf.org/html/rfc6749#section-10.3)

    因此,您可以尝试使用称为“授权代码流”的替代OAuth流,而不是传递对于浏览器,令牌传递一个特殊代码,然后浏览器使用该代码从服务器获取令牌 .

    但是,您的用例并不完全是为此机制创建的,因此我不确定使用它来完成您所遵循的规范 .

  • 0

    为什么不使用内置的apple func和库?

    看看shared web credential

    要在应用中启用共享凭据,请将com.apple.developer.associated- domains键添加到应用的权利中 . 您可以使用目标的功能窗格添加此权利(请参见图1) .

    或使用iCloud Keychain .

    本文档重点介绍如何使用Keychain Services存储和检索密码 . 如果您的应用程序需要处理以下密码,请阅读本文档:多个用户 - 例如,必须对许多用户进行身份验证的电子邮件或计划服务器多个服务器 - 例如,银行或保险应用程序,可能必须与超过一个安全数据库服务器需要输入密码的用户 - 例如,Web浏览器,可以使用钥匙串存储用户多个安全网站所需的密码

    希望它可能有所帮助

相关问题