浏览器 API 和 react-native 应用程序 - 如何处理身份验证?
Posted
技术标签:
【中文标题】浏览器 API 和 react-native 应用程序 - 如何处理身份验证?【英文标题】:API for the browser AND react-native apps - how to handle auth? 【发布时间】:2021-12-08 22:46:12 【问题描述】:第一次,我们正在开发一个新项目,该项目需要支持浏览器(一个网站)和一个基于 react-native 构建的移动应用。
我们有丰富的网络开发经验,但在移动应用领域几乎没有经验。
我们现在正在定义我们的 API 并尝试使其适用于两个平台 - 这将是一个基本的 JSON API,在 Flask 上运行。 API 将有一些公共端点,以及一些受保护的端点(需要身份验证)。 我们需要一个跨平台的身份验证解决方案。
通常,对于 Web,我们一直依赖 Flask 等框架提供的基于 cookie 的会话(加密)。我们已经在各种场景中成功使用了这些:直接从 Web 框架加载 html 模板,甚至当前端应用程序在 React 上运行时(相同的域 + HttpOnly
+ secure
cookie)。
引入 react-native 可能会带来一些新的挑战,我们的一些开发人员担心无法继续使用我们典型的基于会话的 cookie - 他们提倡使用类似 JWT 用于授权,适用于浏览器和应用程序(是的,我知道我们无法将会话与基于令牌的身份验证进行比较)。
我不是基于令牌的授权的忠实拥护者(出于多种原因,如果有人想浪费一些时间,我可以接受这种对话......),我似乎不明白为什么我们不应该坚持我们正常的加密“Cookie”值。
根据使用 Flask cookie 会话,这是我想象的工作方式:
用户使用一些凭据点击/api/login
端点将验证用户并返回任何响应 + 值为 session=<encrypted string>
的 Set-Cookie
标头
来自浏览器/应用程序的任何进一步请求都会再次发回 cookie 值。
基本上,典型的浏览器实现不会有任何改变,这就是浏览器默认的工作方式。
react-native 文档提到了基于 cookie 的身份验证的一些问题:https://reactnative.dev/docs/network#known-issues-with-fetch-and-cookie-based-authentication
据我所知(我对这个主题的了解非常有限),react-native 可能并不总是尊重 Set-Cookie
标头。没关系 - 我们只需要确保将预期的标头与任何进一步的请求一起发回。
理论上,这可以满足我们的要求。
我正在寻找有关我的“解决方案”的反馈,我是否遗漏了什么?我完全弄错了 HTTP 吗?
【问题讨论】:
【参考方案1】:React Native 实际上提供了类似于使用基本 javascript 开发的网站的网络,它也支持基于 cookie 的身份验证,但是有一些严重的警告,如 here 中提到的
以下选项目前不适用于 fetch
重定向:手动 凭据:省略 在 android 上具有相同名称的标头将导致仅存在最新的标头。可以在此处找到临时解决方案:https://github.com/facebook/react-native/issues/18837#issuecomment-398779994。 基于 Cookie 的身份验证当前不稳定。您可以在此处查看提出的一些问题:https://github.com/facebook/react-native/issues/23185 至少在 ios 上,当通过 302 重定向时,如果存在 Set-Cookie 标头,则 cookie 设置不正确。由于重定向 无法手动处理,这可能会导致无限的情况 如果重定向是过期会话的结果,则会发生请求。
因此,我建议不要使用它,因为它不稳定并且可能会让您难以处理
我还建议研究为您处理身份验证的框架,例如 auth0
希望对您有所帮助:)
【讨论】:
以上是关于浏览器 API 和 react-native 应用程序 - 如何处理身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
启用远程调试 JS 后,无法在 React-Native 应用程序上向 API 发出请求
将新数据从Node REST API推送到React-Native
React-Native:在 Android 10 和 9(API 28 和 29)dalvik.system.BaseDexClassLoader.findClass 上崩溃
在 react-native@0.55 发布版本中获取 API 很慢
如何在react-native / redux中处理外部数据库更新?
DocuSign API 返回 URL,在重定向后将控制权从 WebView 转移回 React-Native 应用程序