使用React Native和API后端进行身份validation
我试图用React Native应用程序和一个单独的NodeJS / Express API后端包围oauth。 我明白https://github.com/adamjmcgrath/react-native-simple-auth为React Native应用程序提供身份validation, http ://passportjs.org/为NodeJS后端提供身份validation。 我不确定如何连接这两个身份validationlogin和访问该API。
我希望用户通过电子邮件和密码或通过Facebook / Twitter / Googlelogin到React Native应用程序。 一旦login到应用程序,我应该向API发送什么信息以确保它们已通过身份validation并可以访问特定路线?
以下是一个login并查看login用户设置的示例stream程:
- 用户通过电子邮件/密码或Facebook / Twitter / Googlelogin到React Native应用程序。
- 用户通过身份validation
- 应用程序请求GET / API /设置
- APIvalidation用户是否已通过身份validation并返回该用户的设置或APIvalidation用户未通过身份validation,并返回403。
这个问题有很多,所以它不会全部适合于一个单一的答案,但是这里有一些提示和总体概要,应该广泛地适合于你想要完成的任务。
OAuth2授权
从它的声音,你有兴趣使用OAuth 2提供社交login授权 ,并希望做第一方authentication作为替代与电子邮件和密码。 对于社交login,您将最终使用OAuth 2隐式stream来检索访问令牌,这是一种广泛认可的模式。 由于您也在使用电子邮件和密码来validation用户身份 ,因此您可能需要熟悉OpenID Connect,这是OAuth 2的扩展,除了授权外,还明确支持身份validation。
在任何情况下,一旦您的用户提交了电子邮件/密码组合或通过社交身份提供商授予权限,您将收到访问令牌和(可选) ID令牌 。 这些令牌,可能是一个JWT(JSON Web Token,见jwt.io ),将会以base64编码的string的forms出现,您可以解码以检查JWT的结果,这些结果将包括用户的ID和其他详细信息电子邮件地址,姓名等
有关不同types的stream量的更多信息,请参阅数字海洋的优秀概述 。
使用令牌进行APIauthentication
现在您已拥有访问令牌,您可以将其与所有请求一起传递给您的API,以certificate您已正确validation身份。 您将通过在您的HTTP标头中传递访问令牌(特别是Authorization
标头),并使用Bearer
为您的base64编码的访问令牌(您最初收到的响应您的授权请求的内容)执行此操作。 所以标题看起来像这样:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...
在您的API方面,您将收到该令牌,将其解码,然后validation ID和声明。 通过作为sub
属性中的令牌的一部分将是主题或提出请求的用户的ID。 这是您如何识别访问,并开始在您的API端与相应的用户的权利,烫发等做一些事情。您也一样重要的是,当您在API端收到访问令牌时validation访问令牌,以确保它不是欺骗或手工制作。
隐式stream在RN中的外观如何
以下是针对OAuth 2隐式stream程的React Native中的一般stream程,这将用于社交身份提供者:
- 用户点击React Native UI上的一个社交loginbutton
- 响应这些button的代码将根据每个需要的内容(因为它略有不同)而为这些提供者构build一个请求URL。
- 使用RN中的
Linking
API,您将在设备上的浏览器中打开该URL,将该用户发送给社交提供商,以便他们进行login/授权舞蹈。 - 一旦完成,社交提供者将把用户redirect到你的提供者的URL。 在移动设备上,您将使用自己的自定义urlscheme将用户从networking视图移至您的应用。 这个scheme是你注册的应用程序的一部分,比如
my-awesome-app://
,你传递给社交提供者的redirectURL可能看起来像my-awesome-app://auth_complete/
。 请参阅链接API文档以了解如何configuration这些URLscheme和深层链接。 - 在新的URLscheme/深层链接的处理程序中,您将获得作为URL一部分传递的令牌。 无论是通过手动还是使用库,从urlparsing出令牌并将其存储在您的应用中。 在这一点上,您可以开始将它们视为JWT,并将它们传递给HTTP头以访问API。
资源所有者密码授权stream程在RN中的外观
如果您的API和应用程序相互信任,您可以select将自己的电子邮件/密码组合键用于自己的帐户,或者使用隐式stream程,或者切换到资源所有者密码授予stream程,这意味着您正在同时创build应用程序和API。 我更喜欢移动应用程序上的ROPGstream,因为用户体验更好 – 您不必打开单独的networking视图,只需将他们的电子邮件和密码键入到应用程序的UI元素中即可。 所以说,这是它的样子:
- 用户点击电子邮件/密码组合loginbutton,RN用包含TextInputs的用户界面进行响应以获取电子邮件和密码
- 为您的授权服务器(可能是您的API,或者可能是一个单独的服务器)构build一个POST请求,其中包含传递电子邮件和密码的正确制作的URL和正文详细信息。 发起这个请求。
- auth服务器将在响应主体中响应相关的令牌。 此时,您可以执行之前步骤5中执行的相同操作,在那里存储令牌以供将来在API请求中使用,并检查相关用户信息。
正如你所看到的,ROPG更直接,但只能在高度可信的情况下使用。
在API
在API方面,您检查授权标头中的令牌,如前所述,如果发现您认为用户已被authentication。 有效和validation令牌和用户权限仍然是一个很好的安全实践。 如果没有与请求一起发送令牌,或者发送的令牌已过期,则拒绝该请求。
希望有所帮助! 这当然是重要的,但是这提供了一个总体纲要。