rest - 移动应用 + REST API 身份验证
问题描述
我想构建一个 REST API,它将被移动应用程序和网站使用。我想知道如何为用户实现一个简单的登录系统?
对于一个简单的网站,在检查用户名和密码后,可以设置一个SESSION
变量并让用户“登录”。
现在,REST 是无状态的,所以我怀疑上述方法不是可行的方法。我认为一个可能的解决方案是让服务器在每次用户登录时生成并返回一个访问令牌,并且客户端需要将此访问令牌附加到每个后续请求以访问受保护的端点。
以上是可行的解决方案还是类似的行业标准是什么?
(我发现 OAuth 2.0 有点矫枉过正,但我可能是错的)
解决方案
有多种令牌身份验证方案,但如果您正在寻找行业标准,那么 JWT(JSON Web 令牌)是您的最佳选择。以下是该过程通常进行的方式:
- 客户端将他的凭据(例如用户名和密码)发送到服务器。
- 服务器验证凭据是否正确,生成 JWT 并将其返回给客户端。客户端将令牌保存在例如 localStorage 中。
- 对于每个后续请求,客户端会将 JWT 作为请求的一部分附加(通常在“授权”标头中)。
- 服务器将能够解码 JWT 并决定客户端是否应该有权访问所请求的资源。
现在,JWT 的一些有趣特性来自于其中编码数据这一事实。有些人人都可以解码,有些只有服务器才能解码。
因此,例如,您可以在 JWT 中对用户的 id 和个人资料图片进行编码,以便客户端可以使用其中的数据,而不必向服务器发出另一个请求来获取他的个人资料。
JWT 嵌入了有关过期的信息。服务器可以设置过期时间。
JWT 的另一个很酷的事情是,如果更改它们是无效的。想象一下,你偷了某人的令牌,但它已经过期了。您尝试将令牌内的过期信息更改为将来的某个时间,并将其发送到服务器。服务器将认为该令牌无效,因为内容与附加的签名不匹配,并且只能由服务器生成有效的签名。
推荐阅读
- python - Ironpython - 如何在其他代码行中引用计算变量
- javascript - 如果用户从 Android 设备访问,重定向的最佳方法是什么?
- c# - 从 linq 查询调用方法会引发“在前一个操作完成之前在此上下文上启动的第二个操作......”
- r - 使用带有 stringr::str_extract 的参数函数
- python - pyproj轮文件的安装
- php - NoDecodeDelegateForThisImageFormat - 获取外部图像时出现 php 错误
- static - NUXTJS 静态托管路径
- r - 使用 r 或 rmarkdown 从 excel 填写 Word 和 PDF 表单
- q# - 为什么我在 q# 中使用 DumpMachine 时会出现错误?
- android - 我无法在外部存储中为我的应用创建文件夹