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

selenium · 2019年04月16日 · 最后由 adamshen 回复于 2019年04月18日 · 426 次阅读

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

共收到 9 条回复

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

  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到服务器验证用的吗?为什么要保存起来?

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