问题 在本机应用程序和网站之间共享凭据


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

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

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

似乎Android通过它促进了这一点 共享凭据 功能,但我找不到iOS的等价物。我找到了 共享Web凭据 功能,但似乎需要知道用户的凭据。

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


8983
2018-03-31 02:22


起源



答案:


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

你有两个选择:

  1. 将OAuth访问令牌作为URL-QueryString-Param传递给 网页浏览器。 https://x.y.z/?access_token=abc 您必须操纵嵌入的URL并确保您的后端了解这一点。 非常常见且简单的方法。 Facebook和Facebook等许多网站 Google正在URL中传递访问令牌。
  2. 如果您使用的是应用程序内浏览器(UIWebView,WKWebView),则可以截取URL-Request并自行添加授权标题。看到 这个 用于UIWebView和 这个 对于WKWebView(比UIWebView稍微难点)

12
2018-04-02 09:56



或者让浏览器自己作为客户端运行,并以额外重定向为代价获取自己的令牌 - Hans Z.
@HansZ。你能解释一下你的意思是“让浏览器自己作为客户端运行并以额外重定向为代价获得自己的令牌”吗?非常感谢你。 - Mark O' Brian


答案:


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

你有两个选择:

  1. 将OAuth访问令牌作为URL-QueryString-Param传递给 网页浏览器。 https://x.y.z/?access_token=abc 您必须操纵嵌入的URL并确保您的后端了解这一点。 非常常见且简单的方法。 Facebook和Facebook等许多网站 Google正在URL中传递访问令牌。
  2. 如果您使用的是应用程序内浏览器(UIWebView,WKWebView),则可以截取URL-Request并自行添加授权标题。看到 这个 用于UIWebView和 这个 对于WKWebView(比UIWebView稍微难点)

12
2018-04-02 09:56



或者让浏览器自己作为客户端运行,并以额外重定向为代价获取自己的令牌 - Hans Z.
@HansZ。你能解释一下你的意思是“让浏览器自己作为客户端运行并以额外重定向为代价获得自己的令牌”吗?非常感谢你。 - Mark O' Brian


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

但这将是不安全的:

注入访问令牌 

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

(资源: https://oauth.net/articles/authentication/

规范中也禁止使用:

访问令牌凭据(以及任何机密访问令牌)   属性)必须在运输和存储过程中保密   在授权服务器之间共享,资源服务器访问   token对于发出访问令牌的客户端是有效的。

(资源: https://tools.ietf.org/html/rfc6749#section-10.3

因此,您可以尝试使用名为“授权代码流”的替代OAuth流,而不是将令牌传递给浏览器,应用程序会传递一个特殊代码,然后浏览器会使用该代码从服务器获取令牌。

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


1
2018-04-07 18:01





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

你应该考虑的流程:

  1. 用户打开您的移动应用程序并提示其用户名 或电子邮件和密码。

  2. 您从移动应用程序向您的API服务发送POST请求 包含用户的用户名或电子邮件和密码数据(OVER     SSL!)。

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

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

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

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

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

绝不相信用户输入。


0
2018-04-07 15:21





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

看一眼 共享Web凭据 

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

或使用 iCloud Keychain

本文档重点介绍如何使用Keychain Services来存储和检索密码。如果您的应用程序需要处理以下密码,请阅读此文档:

多个用户 - 例如,必须对许多用户进行身份验证的电子邮件或计划服务器

多个服务器 - 例如,银行或保险应用程序,可能必须与多个安全数据库服务器交换信息

需要输入密码的用户 - 例如,Web浏览器,可以使用钥匙串存储用户多个安全网站所需的密码

希望它可能有所帮助


0
2018-04-08 22:17