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

时间:2016-04-29 16:23:36

标签: node.js oauth react-native passport.js

我正试图用一个React Native应用程序和一个单独的NodeJS / Express API后端包围oauth。我了解https://github.com/adamjmcgrath/react-native-simple-auth为React Native应用提供身份验证,http://passportjs.org/为NodeJS后端提供身份验证。我不确定如何连接这两个用于身份验证以便登录和访问API。

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

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

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

1 个答案:

答案 0 :(得分:83)

这个问题有很多,以至于它不能完全适合单一的答案,但是这里有一些提示和一般概要应该大致适合什么你想完成。

OAuth2授权

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

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

有关不同类型流的详细信息,请参阅this excellent overview on Digital Ocean

使用令牌进行API身份验证

现在您已拥有访问令牌,您可以将其与所有请求一起传递给您,以证明您已经过适当的身份验证。您可以通过传递HTTP标头中的访问令牌(特别是Authorization标头)来执行此操作,并使用{{1为您的base64编码的访问令牌(您最初收到的响应授权请求的内容)作为前缀}}。所以标题看起来像这样:

Bearer

在您的API方面,您将收到该令牌,对其进行解码,然后验证其中的ID和声明。作为Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...属性中令牌的一部分传递的将是主题,或者是发出请求的用户的ID。这就是您如何使用相应的用户权限,权限等识别访问权限并开始在API端执行操作。一旦收到访问令牌,验证也很重要在您的API方面,以确保它不被欺骗或手工制作。

它如何在RN中查看隐式流

以下是针对OAuth 2隐式流的React Native中的一般流程,这是您将用于社交身份提供商的内容:

  1. 用户点击React Native UI上的一个社交登录按钮
  2. 响应按钮的代码将构建一个请求URL给这些提供者,具体取决于每个人想要的(因为它略有不同)。
  3. 使用RN中的sub API,您将在设备上的浏览器中打开该URL,该用户将用户发送给社交提供商,以便他们进行登录/授权舞蹈。
  4. 完成后,社交提供商会将用户重定向到您提供的网址。在移动设备上,您将使用自己的自定义URL方案将用户从Web视图移动到您的应用程序。此方案是您注册为应用的一部分,例如Linking,您传递给社交提供商的重定向网址可能看起来像my-awesome-app://。有关如何配置这些URL方案和深层链接,请参阅the Linking API docs
  5. 在新网址方案/深层链接的处理程序中,您将获取作为网址一部分传递的令牌。无论是手动还是使用库,都可以从URL中解析出令牌并将其存储在您的应用中。此时您可以开始将它们作为JWT进行检查,并在HTTP标头中传递它们以进行API访问。
  6. 它如何在RN中查找资源所有者密码授权流程

    您可以选择自己的帐户使用电子邮件/密码组合,或者使用Implicit流程,或者切换到资源所有者密码授予流程,如果您的API和应用程序都受信任另外,这意味着你正在制作应用程序和API。我更喜欢移动应用程序中的ROPG流程,因为用户体验更好 - 您不必打开单独的Web视图,只需让他们直接在应用程序中输入他们的电子邮件和密码到UI元素中。所以说,这就是它的样子:

    1. 用户点击电子邮件/密码组合登录按钮,RN使用包含电子邮件和密码的TextInputs的UI进行响应
    2. 向您的授权服务器(可能是您的API,或可能是单独的服务器)构建POST请求,其中包含正确制作的URL以及传递电子邮件和密码的正文详细信息。解雇此请求。
    3. auth服务器将使用响应正文中的关联令牌进行响应。此时,您可以执行之前在上面步骤5中执行的相同操作,您可以在其中存储令牌以供以后在API请求中使用,并检查它们以获取相关的用户信息。
    4. 正如您所看到的,ROPG更直接,但只应在高度可信的情况下使用。

      在API

      在API端,您检查Authorization标头中的令牌,并且如前所述,如果找到,则假定用户已经过身份验证。验证令牌和用户权限仍然是一种很好的安全措施。如果没有随请求一起发送令牌,或者发送的令牌已过期,则拒绝该请求。

      希望有所帮助!它确实很重要,但这提供了一个大致的概述。