新手问题 rails api ,如果用 jwt,怎么进行验证码验证呢,验证码的信息应该保存在哪儿呢

selenium · 2019年04月16日 · 最后由 franklinyu 回复于 2019年05月29日 · 2414 次阅读

以前 cookie session 的机制,我可以把验证码放在 session 里面,然后通过 cookie 索引 session 可以获取验证码 如果使用 jwt 的话我看大部分的方案都是不用 session,验证码的数据把存在 token 里面,感觉不大安全,而且我看 jwt 都是登录后服务器返回的,我做验证码验证的时候用户还没登录呢怎么校验?

我做的手机号加验证码功能

  1. 创建一个表,存储手机号和对应的验证码
  2. 客户端请求验证码,生成一条手机号对应验证码的记录,然后把验证码通过短信发给客户端
  3. 客户端请求登录,带上手机号和验证码, 验证成功的话,生成一个 token 给客户端

如果你说的是图片验证码,应该也可以根据 ip 或者其它特有的属性创建条记录

2楼 已删除

验证码验证和 JWT 好像没什么关系?

JWT 登录的大概流程 ---- 参考代码使用这个ruby-jwt

首次访问 (登录)

客服端 输入用户名和密码登录

服务器 验证用户名,密码,验证码,正确就返回一个 jwt token,里面包含一些用户信息,比如 ID 之类的

payload = {user_id: user.id, expire: (Time.now + 1.week).to_i}

token = JWT.encode payload, secret_key

第二次访问

客服端 把接收到的 token 发送给服务器

服务器 对 token 进行解析,得到你开始设置的用户信息,比如 ID 什么的,验证 ID 是否有效,是否过期之类的

decoded_token = JWT.decode token, nil, false
decoded_token包含了你开始设置的user_idexpire

验证码信息直接放 JWT 里面不太阔学,JWT 的核心是校验,数据相当于是明文的,倒是可以 JWT 做的 auth,验证码放在后端存储里,比如 Rails.cache

Rails 的 session 基于 cookies 存储时是加密的,所以可以放敏感信息,同理你可以对验证码先加密,再放到 JWT 中,不过这就有点舍近求远了

另外补充一下,JWT 更常见的使用场景是非浏览器情况下的 API 通讯,在已知是面向浏览器用户的 API 上为什么不直接用 cookies 呢

当人手里拿着锤子的时候,看满世界都是钉子

liuminhan 回复

你这个思路不错

heroyct 回复

我看了很多 jwt 的例子都是没有讲登录配合验证码校验

IChou 回复

我是做 windows 应用开发和测试开发的,web 开发接触的比较少,所以不是很懂,我前端用 vue 写的单页应用,调用 rails 写的 api 服务,这样的场景下用 rails 的 cookie session 机制好吗?因为我的项目是 rails new --api 生成的,我看了下中间件里面拿掉了 cookie 和 session,那就再把 cookie session 的中间件加进来?

selenium 回复

即使前后端分离,在浏览器场景下,cookie 和 session 机制依然适合

If you're on Rails 5, and want to preserve config.api_only = true you could extend the middleware to add the sessions layer, adding this code after class Application < Rails::Application in config/application.rb

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'

This could come in handy when you want to have a rails api-only enabled app but have to manage user sessions with an administration panel like ActiveAdmin or Rails_Admin.

以上来自 https://stackoverflow.com/questions/15342710/adding-cookie-session-store-back-to-rails-api-app

请教一下楼主,验证码不是用户在登录的时候直接 post 到服务器验证用的吗?为什么要保存起来?

11楼 已删除

不使用 session 無法做到異地登出,JWT 不是用來替代 session 的……

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册