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

Ken*_*art 13 security safari ios oauth-2.0

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

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

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

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

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

Sve*_*ker 11

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

您有两种选择:

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

  • 即使使用 TLS,在 URL 中发送访问令牌也不是一种安全的方法,因为它可以在不同的地方进行清晰的检查,例如浏览器历史记录、服务器日志、Referer 标头(例如发送到第三方分析服务) )。 (3认同)

Jac*_*art 5

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

但这将是不安全的:

注入访问令牌

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

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

规范中也禁止:

访问令牌凭证(以及任何机密的访问令牌属性)必须在传输和存储过程中保密,并且只能在授权服务器、访问令牌对其有效的资源服务器以及访问令牌颁发给的客户端之间共享.

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

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

但是,您的用例并不是创建此机制的确切目的,因此我不确定使用它来完成您所追求的事情是否符合规范。