使用 React 本机和 API 后端的身份验证

我试图用一个 React 本机应用程序和一个单独的 NodeJS/Express API 后端来完成我的誓言。我知道 https://github.com/adamjmcgrath/react-native-simple-auth为 React 本机应用程序提供身份验证,而 http://passportjs.org/为 NodeJS 后端提供身份验证。我不确定如何连接这两个身份验证登录和访问的 API。

我希望用户可以通过电子邮件和密码或者通过 Facebook/Twitter/Google 登录到 React Nativeapp。一旦登录到应用程序中,我应该向 API 发送什么来确保它们通过身份验证并能访问特定的路由?

下面是一个用于登录和查看登录用户设置的示例流:

  1. 用户通过电子邮件/密码或 Facebook/Twitter/Google 登录到 React Nativeapp。
  2. 用户已验证
  3. 应用程序请求 GET/api/设置
  4. API 验证用户是否经过身份验证,并返回用户的设置或 API 验证用户是否经过身份验证,并返回一个403。
20843 次浏览

这个问题有很多问题,以至于不能用一个简单的 SO 答案来回答,但是这里有一些技巧和一个大致的轮廓,它们应该大致适合你想要完成的事情。

OAuth2授权书

从它的声音,您有兴趣使用 OAuth 2提供社会登录 授权,并希望做第一方 认证作为一个替代的电子邮件和密码。对于社交登录,您最终将使用 OAuth 2隐式流来检索访问令牌,这是一种广泛认可的模式。因为您还希望 鉴定用户使用电子邮件和密码,所以您可能需要熟悉 OpenID Connect,它是 OAuth 2的扩展,除了授权之外,它还明确支持身份验证。

在这两种情况下,一旦您的用户提交了电子邮件/密码组合或通过社会身份认证提供商授予许可,您将收到一个 访问令牌和(可选)一个 身份令牌的响应。这些令牌可能是 JWT (JSON Web Token,参见 Jwt.io) ,它们看起来像 base64编码的字符串,您可以对其进行解码以检查 JWT 的结果,其中包括用户 ID 和其他细节,如电子邮件地址、姓名等。

有关不同类型流的更多信息,请参见 数码海洋概览

使用令牌进行 API 身份验证

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

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...

在 API 方面,您将接收该令牌,对其进行解码,然后 核实 ID 并在其中声明。在 sub属性中作为令牌的一部分传递的将是发出请求的用户的 主题或 ID。这就是如何确定访问权限并开始在 API 端使用各个用户的权限、 perms 等进行操作的方法。一旦您在 API 端接收到访问令牌,确认也很重要,以确保它不是欺骗或手工制作的。

隐式流在 RN 中看起来如何

下面是 React NativeforOAuth 2隐式流程中的一般流程,这是您将用于社会身份提供者的流程:

  1. 用户点击 React NativeUI 上的一个社交登录按钮
  2. 响应这些按钮的代码将为这些提供程序构建一个请求 URL,具体取决于每个提供程序想要什么(因为它们之间略有不同)。
  3. 使用 RN 中的 Linking API,您将在设备上的浏览器中打开该 URL,该设备将用户发送到社交提供商,让他们进行登录/授权之舞。
  4. 一旦完成,社交服务提供者将重定向用户到您提供的 URL。在移动设备上,你可以使用自定义 URL 方案将用户从 Web 视图移动到你的应用程序。这个方案是您注册为应用程序的一部分,比如 my-awesome-app://,并且您传递给社交提供者的重定向 URL 可能看起来像 my-awesome-app://auth_complete/。有关如何配置这些 URL 模式和深度链接的信息,请参见 链接 API 文档
  5. 在新 URL 模式/深度链接的处理程序中,您将获得作为 URL 的一部分传递的令牌。通过手工或使用库,从 URL 中解析出标记并将它们存储在应用程序中。此时,您可以开始将它们作为 JWT 进行检查,并在 HTTP 头中将它们传递给 API 访问。

资源所有者密码授予流的 RN 看起来如何

你可以选择你自己的邮件/密码组合,要么坚持隐式流程,要么切换到资源所有者密码授予流程 如果,你的 API 和应用程序是相互信任的,这意味着你正在制作应用程序和 API。在可能的情况下,我更喜欢移动应用程序上的 ROPG 流程,因为用户体验要好得多——你不需要打开一个单独的 web 视图,你只需要让他们直接在应用程序中输入他们的电子邮件和密码到 UI 元素中。所以说,它看起来是这样的:

  1. 用户点击电子邮件/密码组合登录按钮,RN 用一个包含电子邮件和密码的 TextInput 的 UI 进行响应
  2. 构建一个 POST 请求到您的授权服务器(可能是您的 API,也可能是一个单独的服务器) ,其中包括正确制作的 URL 和正文细节,这些细节将传递电子邮件和密码。发射这个请求。
  3. 身份验证服务器将使用响应主体中的相关令牌进行响应。此时,您可以执行上面步骤5中所做的同样的操作,存储令牌以便稍后在 API 请求中使用,并检查它们是否有相关用户信息。

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

在 API

在 API 端,检查 Authorization 头中的令牌,如前所述,如果发现,则假定用户已经通过身份验证。有效和验证令牌和用户权限仍然是很好的安全实践。如果请求中没有发送令牌,或者发送的令牌已过期,则拒绝请求。

希望这能有所帮助! 它当然有很多内容,但这只是一个大概的轮廓。