使用 React Native 和 API 后端进行身份验证

2024-03-04

我正在尝试使用 React Native 应用程序和单独的 NodeJS/Express API 后端来理解 oauth。我明白https://github.com/adamjmcgrath/react-native-simple-auth https://github.com/adamjmcgrath/react-native-simple-auth为 React Native 应用程序提供身份验证http://passportjs.org/ http://passportjs.org/为 NodeJS 后端提供身份验证。我不确定如何连接这两者以进行登录身份验证和访问 API。

我希望用户通过电子邮件和密码或通过 Facebook/Twitter/Google 登录 React Native 应用程序。登录应用程序后,我应向 API 发送什么内容以确保它们经过身份验证并有权访问特定路由?

以下是登录并查看登录用户设置的示例流程:

  1. 用户通过电子邮件/密码或 Facebook/Twitter/Google 登录 React Native 应用程序。
  2. 用户已通过身份验证
  3. 应用程序向 GET /api/settings 发出请求
  4. API 验证用户是否经过身份验证并返回用户的设置,或者 API 验证用户未经过身份验证并返回 403。

这个问题涉及很多内容,以至于无法用一个单一的答案来解决,但这里有一些提示和总体轮廓,应该广泛适合您想要完成的任务。

OAuth2授权

听起来,您有兴趣使用 OAuth 2 提供社交登录授权,并且想做第一方验证作为使用电子邮件和密码的替代方案。对于社交登录,您最终将使用 OAuth 2 隐式流程来检索访问令牌,这是一种广泛认可的模式。因为你也在寻找认证对于拥有电子邮件和密码的用户,您可能需要熟悉 OpenID Connect,它是 OAuth 2 的扩展,除授权外还明确支持身份验证。

无论哪种情况,一旦您的用户提交了电子邮件/密码组合或通过社交身份提供商授予了权限,您将收到响应访问令牌和(可选)一个ID token。令牌,可能是 JWT(JSON Web 令牌,请参阅jwt.io http://jwt.io)将作为一个 base64 编码的字符串出现,您可以对其进行解码以检查 JWT 的结果,其中包括用户 ID 等信息以及电子邮件地址、姓名等其他详细信息。

有关不同类型流的更多信息,请参阅关于数字海洋的精彩概述 https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2.

使用令牌进行 API 身份验证

现在您已经有了访问令牌,您可以将其与所有请求一起传递到您的 API,以证明您已正确进行身份验证。您将通过在 HTTP 标头中传递访问令牌来完成此操作,特别是Authorization标头,在您的 base64 编码的访问令牌(您最初收到的响应授权请求时收到的令牌)前面加上Bearer 。所以标题看起来像这样:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...

在 API 方面,您将收到该令牌,对其进行解码,然后verifyID 和其中的声明。作为令牌的一部分传递sub财产将是subject,或发出请求的用户的 ID。这是您识别访问权限并开始使用相应用户权限、权限等在 API 端执行操作的方式。同样重要的是,您validate一旦您在 API 端收到访问令牌,就可以确保它不是欺骗或手工制作的。

隐式流程在 RN 中的表现如何

以下是 React Native for OAuth 2 隐式流程的一般流程,您将使用它来创建社交身份提供商:

  1. 用户点击 React Native UI 上的社交登录按钮之一
  2. 响应按钮的代码将根据每个提供程序的需求构建一个到这些提供程序的请求 URL(因为它们略有不同)。
  3. 使用Linking在 RN 中的 API 中,您将在设备上的浏览器中打开该 URL,该 URL 将用户发送到社交提供商,以便他们进行登录/授权舞蹈。
  4. 完成后,社交提供商会将用户重定向到您提供的 URL。在移动设备上,您将使用自己的自定义 URL 方案将用户从 Web 视图移至您的应用程序。该方案是您作为应用程序一部分注册的内容,例如my-awesome-app://,您传递给社交提供商的重定向 URL 可能如下所示my-awesome-app://auth_complete/. See 链接 API 文档 http://facebook.github.io/react-native/docs/linking.html了解如何配置这些 URL 方案和深层链接。
  5. 在该新 URL 方案/深层链接的处理程序中,您将获得作为 URL 一部分传递的令牌。手动或使用库,从 URL 中解析出令牌并将其存储在您的应用程序中。此时,您可以开始将它们作为 JWT 检查,并将它们传递到 HTTP 标头中以进行 API 访问。

RN 中资源所有者密码授予流程的外观如何

您可以选择自己帐户的电子邮件/密码组合,坚持使用隐式流程,或切换到资源所有者密码授予流程if您的 API 和应用程序相互信任,这意味着您同时制作应用程序和 API。我更喜欢移动应用程序上的 ROPG 流程,因为用户体验要好得多——您不必打开单独的 Web 视图,只需让他们直接在应用程序中的 UI 元素中输入电子邮件和密码即可。话虽如此,它看起来是这样的:

  1. 用户点击电子邮件/密码组合登录按钮,RN 会使用包含电子邮件和密码的 TextInputs 的 UI 进行响应
  2. 向您的授权服务器(可能是您的 API,也可能是单独的服务器)构建一个 POST 请求,其中包括正确设计的 URL 以及传递电子邮件和密码的正文详细信息。触发此请求。
  3. 身份验证服务器将在响应正文中使用关联的令牌进行响应。此时,您可以执行与之前在上述步骤 5 中执行的操作相同的操作,即存储令牌以供以后在 API 请求中使用,并检查它们以获取相关的用户信息。

正如您所看到的,ROPG 更简单,但只应在高度可信的场景中使用。

在 API 中

在 API 方面,您检查 Authorization 标头中的令牌,如前所述,如果找到,则假设用户已通过身份验证。有效和验证令牌和用户权限仍然是良好的安全实践。如果请求中没有发送令牌,或者发送的令牌已过期,则您将拒绝该请求。

当然有很多内容,但这提供了一个总体轮廓。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 React Native 和 API 后端进行身份验证 的相关文章

随机推荐

  • R通过R_LIBS设置库路径

    我已阅读 R 常见问题解答和其他帖子 但我有点困惑 并且很高兴知道我所做的一切是否正确 在Windows中 为了修改默认的库文件夹 我创建了一个文件Renviron site并放入里面E Programs R 3 3 0 etc 该文件只有
  • 如何在 VBA for Ms Access 中擦除或重新加载 InkPicture 笔画?

    我想显示之前在 Ms Access 中的 inkPicture 对象上保存的笔画 它位于通过 ActiveX 的表单上 笔划作为 ole 对象保存在表中的 笔划 字段中 现在 执行一次就足够简单了 一行代码 我可以毫无问题地使用此代码片段
  • 计算 pyspark 中的分组中位数

    使用 pyspark 时 我希望能够计算分组值与其中值之间的差异 这可能吗 这是我编写的一些代码 它可以执行我想要的操作 除了它计算平均值的分组差异之外 另外 如果您愿意提供帮助 请随时评论我如何做得更好 from pyspark impo
  • web.config 转换在构建服务器上不起作用

    我们正在与 Team City 建立持续集成 在签到的基础上进行构建 这工作正常 但是它总是使用默认的 web config 构建 它不会随着开发环境特定的 Web 配置进行转换 在 Visual Studio 中 我为开发创建了自定义构建
  • std::remove_if 和 std::isspace - 编译时错误

    我有以下代码 include
  • Python 属性描述符设计:为什么要复制而不是变异?

    我正在研究Python如何实现属性描述符 https docs python org 2 howto descriptor html properties内部 根据文档property 是根据描述符协议实现的 为了方便起见 在此处复制它 c
  • Qt - webkit - 如何以编程方式登录

    我正在制作一个网络爬虫 因为我需要以编程方式登录我的电子邮件帐户 谁能说一下如何实现这一目标 我认为 QNetworkAccesManager 和它的 get 可以做到这一点 但是 我不太清楚 请有人阐明这个问题 注意 我使用的是 Qt 4
  • 使用查询字符串参数消除 UriTemplate 匹配的歧义

    我正在使用 WCF 4 0 创建 REST ful Web 服务 我想做的是根据查询字符串参数调用不同的服务方法UriTemplate 例如 我有一个 API 允许用户使用驾驶执照或社会安全号码作为密钥来检索有关人员的信息 在我的Servi
  • 如何从用户计算机加载图像

    是否可以从用户计算机将图像加载到 XNA 游戏 例如 我想将 C Images Box png 加载到精灵纹理 是否可以 如果是 怎么办 在XNA 4 0中使用Texture2D FromStream http msdn microsoft
  • 使用 IIS 调试 ASP.NET

    我已经在 Visual Studio 2008 中将调试设置为 IIS 而不是内置服务器 这样我就可以在开发时运行 url 重写 使用 IIRF 花了一段时间才开始工作 更改权限 重新安装 NET 框架 但它正在工作 我关闭了机器 现在它重
  • 将 ClassPathScanningCandidateComponentProvider 与多个 jar 文件一起使用?

    我正在考虑使用 ClassPathScanningCandidateComponentProvider 在 JVM 中查找特定类的子类 我正在做的事情几乎完全按照这里描述的进行 在运行时扫描Java注释 https stackoverflo
  • Android 中双 SIM 卡设备的手机号码验证

    我已经在我的应用程序中完成了 SIM 手机号码验证 与 Whats APP 相同 部分 就像是 发送消息部分 SmsManager sm SmsManager getDefault sm sendTextMessage mobileNumb
  • 在sql server表中存储标签的最佳方式?

    存储记录标签的最佳方式是什么 只使用 varchar 字段 当选择包含标签 x 的行时怎么样 使用like运算符 thanks 取决于两件事 1 标签 标记记录的数量2 无论你是否对正常化有宗教观点 除非处理大量数据 否则我建议使用一个 标
  • 如何替换 ajax 加载的 html 文档上的元标题、关键字和描述?

    如何用 ajax 调用中传入的 html 文档中的元标题和描述替换文档上的元标题和描述 我正在从相邻 html 文档上的 content div 调用新内容 我想要发生的是 当新内容加载时 我想用正在加载的 html 文件中的元标题替换主文
  • 优化 ORDER BY 查询

    我不知所措 我有一个大约有 100K 行的表 查询该表时 结果通常很快 大约 2 毫秒左右 但每当我使用 ORDER BY 时 性能就会急剧下降到 120 毫秒左右 我读了MySQL ORDER BY 优化 http dev mysql c
  • .Dispose a StreamWriter 是否会关闭底层流?

    StreamWriter Close 表示它还会关闭 StreamWriter 的底层流 StreamWriter Dispose 怎么样 Dispose 是否也会处理和 或关闭底层流 StreamWriter Close 只是打电话Str
  • 基于数据帧名称中的通用模式 rbind 数据帧

    假设我有多个数据帧 它们都具有相同的向量名称 并且我想绑定所有具有共同模式的数据帧 所以对于这 3 个数据框 df 1 lt data frame column1 factor sample c Male Female 10 replace
  • 从 JavaScript Ajax 调用者调用 PHP 函数

    我需要对 php 类中的 php 函数进行 ajax 调用 文件夹是这样的 controllers folder User php php file View folder js folder myjavascriptfile js 里面m
  • 如何在tvOS上显示GameCenter排行榜?

    I think我按照所有必需的步骤在我的游戏中支持排行榜 它们在 iOS 上运行得很好 但是在 tvOS 上无法配置GKGameCenterViewController要显示特定的排行榜 LeaderboardIdentifier属性只是丢
  • 使用 React Native 和 API 后端进行身份验证

    我正在尝试使用 React Native 应用程序和单独的 NodeJS Express API 后端来理解 oauth 我明白https github com adamjmcgrath react native simple auth h