我正试图用一个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发送什么以确保它们经过身份验证并可以访问特定路由?
以下是登录并查看登录用户设置的示例流程:
答案 0 :(得分:83)
这个问题有很多,以至于它不能完全适合单一的答案,但是这里有一些提示和一般概要应该大致适合什么你想完成。
根据它的声音,您有兴趣使用OAuth 2提供社交登录授权,并希望将第一方身份验证作为替代方案电子邮件和密码。对于社交登录,您最终将使用OAuth 2隐式流来检索访问令牌,这是一种广泛认可的模式。由于您还希望使用电子邮件和密码对用户进行身份验证,因此您可能需要熟悉OpenID Connect,它是OAuth 2的扩展,除了授权之外还明确支持身份验证。
在任何一种情况下,一旦您的用户提交了电子邮件/密码组合或通过社交身份提供商授予了权限,您将收到访问令牌和(可选)的响应ID令牌。令牌,可能是JWT(JSON Web令牌,请参阅jwt.io)将作为base64编码的字符串出现,您可以解码以检查JWT的结果,其中包括用户的ID和其他内容。详细信息,如电子邮件地址,姓名等。
有关不同类型流的详细信息,请参阅this excellent overview on Digital Ocean。
现在您已拥有访问令牌,您可以将其与所有请求一起传递给您,以证明您已经过适当的身份验证。您可以通过传递HTTP标头中的访问令牌(特别是Authorization
标头)来执行此操作,并使用{{1为您的base64编码的访问令牌(您最初收到的响应授权请求的内容)作为前缀}}。所以标题看起来像这样:
Bearer
在您的API方面,您将收到该令牌,对其进行解码,然后验证其中的ID和声明。作为Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...
属性中令牌的一部分传递的将是主题,或者是发出请求的用户的ID。这就是您如何使用相应的用户权限,权限等识别访问权限并开始在API端执行操作。一旦收到访问令牌,验证也很重要在您的API方面,以确保它不被欺骗或手工制作。
以下是针对OAuth 2隐式流的React Native中的一般流程,这是您将用于社交身份提供商的内容:
sub
API,您将在设备上的浏览器中打开该URL,该用户将用户发送给社交提供商,以便他们进行登录/授权舞蹈。Linking
,您传递给社交提供商的重定向网址可能看起来像my-awesome-app://
。有关如何配置这些URL方案和深层链接,请参阅the Linking API docs。您可以选择自己的帐户使用电子邮件/密码组合,或者使用Implicit流程,或者切换到资源所有者密码授予流程,如果您的API和应用程序都受信任另外,这意味着你正在制作应用程序和API。我更喜欢移动应用程序中的ROPG流程,因为用户体验更好 - 您不必打开单独的Web视图,只需让他们直接在应用程序中输入他们的电子邮件和密码到UI元素中。所以说,这就是它的样子:
正如您所看到的,ROPG更直接,但只应在高度可信的情况下使用。
在API端,您检查Authorization标头中的令牌,并且如前所述,如果找到,则假定用户已经过身份验证。验证令牌和用户权限仍然是一种很好的安全措施。如果没有随请求一起发送令牌,或者发送的令牌已过期,则拒绝该请求。
希望有所帮助!它确实很重要,但这提供了一个大致的概述。