JWT 构建Rails API 授权登录
参考下面的连接
使用Rails构建JSON-API
https://chorder.net/2018/07/31/使用Rails构建JSON-API/
安装jwt组件
Gemfile里添加
# jwt
gem 'jwt'
执行命令:
bundle install
创建base_controller.rb控制器
这个控制器的代码就会位于app/controllers/api/v1/base_controller.rb,我们需要在其中完善一些权限有关的配置。
由于Rails默认的安全属性,以及我们如果之前自定义了一些控制器中的过滤方法,我们需要在该控制器中跳过它,例如我们首先禁用rails自带的CSRF 保护和CSRF token的输出,以及去除掉返回包中的set-cookies头,由于我的应用还使用了devise作为用户认证的模块,所以还要在此禁用掉authenticate_user方法。
完整的代码如下
新建一个控制器
rails g controller api/v1/base --no-assets
class Api::V1::BaseController < ApplicationController
# disable the CSRF token
# protect_from_forgery with: :null_session
# disable cookies (no set-cookies header in response)
# before_action :destroy_session
before_action :check_login
# disable the CSRF token
skip_before_action :verify_authenticity_token
# skip devise user authentication
# skip_before_action :authenticate_user!
# skip_before_action :authenticate_admin!
# def destroy_session
# request.session_options[:skip] = true
# end
@current_user
def check_login
puts "request.path222 #{request.path}"
unless ["/api/v1/login"].include?(request.path)
@current_user = current_user1()
if @current_user.blank?
# render json: {msg: "登录失败", result: false}, status: :forbidden
render json: { statusCode: 4001, messages: "token验证失败,请重新登陆.", data: [] }
end
end
end
def current_user1
if request.headers['Authorization']&.start_with?("Bearer")
jwt_token = request.headers['Authorization'].split&.last
# puts "jwt_token11:#{jwt_token}"
jwt_info = Token::decoded_jwt_infos(jwt_token)
# puts "jwt_info11:#{jwt_info}"
user = User.find_by(id: jwt_info["user_id"])
# puts "jwt_info222:#{jwt_info}"
if Time.parse(jwt_info["exp_at"]) > Time.now && user.present?
user
else
nil
end
end
rescue JWT::ExpiredSignature, JWT::VerificationError
nil
end
end
创建好base控制器以后,我们需要在这个控制器的基础上派生出一些新的控制器,这里我们新建一个login_controller.rb控制器
rails g controller api/v1/login`` --no-assets
此时除了会生成控制器代码以外,还会在app/views/api/v1目录下创建login目录,作为模板存放的目录。
login控制器的代码位于app/controllers/api/v1/login_controller.rb,内容如下
class Api::V1::LoginController < Api::V1::BaseController
def index
# Token.decoded_jwt_infos()
puts "logins index"
end
def create
puts "params[password]:#{params[:password]}"
user = User.find_by(username: params[:username])
unless user.present?
# flash.now[:notice] = "用户名不存在"
# render :index and return
render json: { statusCode: 4002, messages: "用户名不存在", data: [] }
return
end
unless user.valid_password?(params["password"])
render json: { statusCode: 4003, messages: "用户名或密码错误",data:[]}
return
end
if user.category.blank? || user.category != "super_admin"
render json: { statusCode: 4004, messages: "用户没有权限",data:[]}
return
end
# render json: payload(@member)
data = {
id: user.id,
username: user.username,
category: user.category,
token: Token.encode(user) }
render json: { statusCode: 200, messages: "SUCCESS", data: data }
end
def check_token
puts "#{Time.now} @check_token22->:#{@current_user.to_json}"
user = @current_user
puts "#{Time.now} user333:#{user.to_json}"
# Token.decoded_jwt_infos()
# user = current_user
# @user = User.find(params[:id])
data = {
id: user.id,
username: user.username,
category: user.category }
render json: { statusCode: 200, messages: "ok", data: data }
end
end
配置路由
接下来我们对路由config/routes.rb进行配置
namespace :api do
namespace :v1 do
resources :login, only: [:create] do
collection do
post :check_token
end
end
end
end
启动Rails程序
rails s
用户登陆-api接口
访问接口
访问http://127.0.0.1:3000/api/v1/login,即可看到接口输出的JSON数据。
curl -X POST 'http://10.10.11.133:8080/api/v1/login' \
--header 'Content-Type: application/json' \
--data '{
"username": "admin",
"password":"123456"
}'
响应示例
成功响应示例
{
"statusCode": 200,
"messages": "SUCCESS",
"data": {
"id": 1, //用户id
"username": "admin", //用户登陆名
"category": "super_admin", //角色类型:super_admin:超级管理员
"token": "eyJhbGciOiJIUzI1NiJ9.eyJleHBfYXQiOiIyMDIyLTAxLTE3IDExOjU5OjU4ICswODAwIiwidXNlcl9pZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.Fens2VDYy8Br6FyEtcCyMa4caUWrfGcGr2gLtu77dCM" //登陆token
} //返回数据
}
验证用户token信息-api接口(*)
curl --location --request POST 'http://10.10.11.133:8080/api/v1/login/check_token' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHBfYXQiOiIyMDIyLTAxLTE3IDExOjU5OjU4ICswODAwIiwidXNlcl9pZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.Fens2VDYy8Br6FyEtcCyMa4caUWrfGcGr2gLtu77dCM'
响应示例
成功响应示例
{
"statusCode": 200,
"messages": "SUCCESS",
"data": {
"id": 1, //用户id
"username": "admin", //用户登陆名
"category": "super_admin" //角色类型:super_admin:超级管理员
} //返回数据
}
JWT 构建Rails API 授权登录的更多相关文章
- laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效
laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- spring cloud+.net core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- [转] Android:微信授权登录与微信分享全解析
https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...
- 微信授权登录mock(在没有真实微信账号的情况下测试大量微信账户授权登录的情况)
场景介绍 对于构建在微信公众号的系统,帐号体系往往使用微信授权登录(如各类微信商城应用系统). 这样操作不仅可以实现静默注册,对用户几乎是无感的,同时也达到了区分用户,获取用户基本信息(头像,昵称等) ...
- spring jwt springboot RESTful API认证方式
RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性. Authenticatio ...
- Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制
摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能 ...
- 基于Shiro,JWT实现微信小程序登录完整例子
小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...
- 通过 SCF Component 轻松构建 REST API,再也不用熬夜加班了
本教程将分享如何通过 Serverless SCF Component .云函数 SCF 及 API 网关组件,快速构建一个 REST API 并实现 GET/PUT 操作. 当一个应用需要对第三方提 ...
- Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一)
标题 Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一) 技术 Spring Boot 2.Spring Security 5.JWT 运行环境 ...
随机推荐
- KingbaseES Json 系列二:Json对象函数
KingbaseES Json 系列二--Json对象函数(JSONB_BUILD_OBJECT,JSONB_OBJECT,JSON_BUILD_OBJECT,JSON_OBJECT) JSON 数据 ...
- Windows线程API —CreateTimerQueueTimer/DeleteTimerQueueTimer的使用
问题代码: 1 #include<windows.h> 2 #include<iostream> 3 #include<thread> 4 HANDLE h1; 5 ...
- IDEA彩虹括号插件Rainbow Brackets
IDEA搜索插件Rainbow Brackets 安装后重启IDEA 效果如图:不同层级的括号会变成不同的颜色,便于区分. 光标定位到前一个括号后,使用快捷键ALT+鼠标右键可以只查看当前括号中的内容 ...
- 关于 ThreadLocalRandom 随机数生成器
ThreadLocalRandom 线程安全随机数获取. 示例随机整数:java.util.concurrent.ThreadLocalRandom.current().nextInt(); 线程Th ...
- SC的板子库~
观前须知 Sugar_Cube的博客园主页 声明 本文所有内容遵循CC BY-NC-SA 4.0 Deed原则 本文包含了笔者常用的OI算法.数据结构的模板 不保证算法最优,但能通过相应的模板题(如果 ...
- Vue3 Diff 之 patchKeyedChildren 动态示例
在学习全网学习各路大神的关于Vue3 Diff算法分析文章的时候,一定离不开关键方法 patchKeyedChildren. patchKeyedChildren 处理的场景比较多,大致有 5 个主要 ...
- #分治,Dijkstra#洛谷 3350 [ZJOI2016]旅行者
题目 给定一张\(n*m\)的网格图,\(q\)次询问两点之间距离 \(n*m\leq 2*10^4,q\leq 10^5\) 分析 首先floyd会TLE,考虑两点间距离可以由两段拼凑起来, 那么枚 ...
- #状压dp#D 诗人小K
分析 考虑题目的唯一突破口就是\(x,y,z\) 那么要与二进制状态挂上钩,状态应表示某一段正好为\(x,y或z\) 设\(g[s][i]\)表示当前位置的元素为\(i\),上一次状态为\(s\), ...
- Git分支教程:详解分支创建、合并、删除等操作
Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效.分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作.本篇博客将详解Git分支的创建.合并.删 ...
- 可视化库 pygal 生成png中文乱码
解决方法:设置style,style中设置中文字体 代码如下: import pygal from pygal.style import Style import cairosvg style = S ...