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 V8R6 几种不同的表复制方式
前言 当数据库遇到未知问题,有时候无法入手分析,在非生产数据库或者征得客户同意获得特殊时间,需要重建表解决,下面提供了多种不同的复制表的方法,我们了解一下他们的差异. 测试 1.CREATE TABL ...
- (Nosql)列式存储是什么?
首先nosql可以被理解为not only sql 泛指非关系型数据库,也就是说不仅仅是sql,所以它既包含了sql的一些东西,但是又和sql不同,并在其的基础上改变或者说扩展了一些东西. 提到nos ...
- 【转载】Vue路由 hash与history 的区别
[转载]Vue路由 hash与history 的区别 两种路由模式原因 对于 Vue 这类渐进式前端开发框架, 为了构建 SPA(单页面应用), 需要引入前端路由系统, 这也就是 Vue-Router ...
- #Tarjan,SPFA,差分约束系统#BZOJ 2330 AcWing 368 银河
题目 分析 首先这明显是一道差分约束题,但是无解的情况确实比较恶心, 考虑它的边权为0或1,无解当且仅当某个强连通分量内的边至少一条边边权为1, 那么用有向图的Tarjan缩点后跑SPFA就可以了 代 ...
- vc修改ocx控件classID
背景: 客户希望,classID 为客户自已定义好的一个 ID ,由于我们自动生成的 classID 和客户定义的 ID 不同,所以我们需要修改 classID 为客户指定的 ID 解决方法: 1.打 ...
- 动态库 DLL 封装二:dll封装方法
例:我新建的工程是,带lib的MFC规则的DLL 主要有三个文件需要写东西 ( .h / .cpp / .def ) 示例: // a.h ...... #ifdef __cplusplus e ...
- 京东一面:如何在SpringBoot启动时执行特定代码?有哪些方式?
引言 Spring Boot 提供了许多便捷的功能和特性,使得开发者可以更加轻松地构建强大.高效的应用程序.然而,在应用程序启动时执行一些初始化操作是至关重要的,它可以确保应用程序在启动后处于预期的状 ...
- .Net 代码分析工具对比 visual studio 2022 current
目录 原因 背景知识 名词解释 分析器 分析器在IDE里 目标 查找思路及过程 CodeMaid Roslyn StyleCop.Analyzer StyleCop? StyleCop.Analyze ...
- centos7搭建vsftpd环境详解[亲测成功]
centos7搭建vsftpd环境详解(亲测) 标签: centos7vsftpd 分类: linux相关(关于centos)(2) 版权声明:本文为博主原创文章,未经博主允许不得转载. 初学L ...
- vue3.0体验版生命周期
使用方法:cnpm install --save @vue/composition-api在组件内引入 把上图的 onMounted 换成(2.6->3.0) beforeCreate-> ...