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 运行环境 ...
随机推荐
- MySQL 索引失效场景总结
查询条件有 or 假设在 customer_name 字段设置了普通索引,执行以下 sql: # type: ref, possible_keys: idx_customer_name, key: i ...
- JDK14性能管理工具:jmap和jhat使用介绍
目录 简介 jmap clstats finalizerinfo histo dump jhat 总结 简介 我们在写代码的过程中,经常会遇到内存泄露的问题,比如某个集合中的对象没有被回收,或者内存出 ...
- OpenHarmony加速行业应用落地,多款软件发行版正通过兼容性测评
4 月 25 日,OpenAtom OpenHarmony(以下简称"OpenHarmony")技术日在深圳举办,大会聚焦 OpenHarmony 3.1 Release 版本核心 ...
- 4步成功将三方库——speexdsp移植到OpenHarmony
战码先锋,PR征集令(以下简称"战码先锋")第二期正如火如荼地进行中,涉及OpenAtom OpenHarmony(以下简称"OpenHarmony")主干仓 ...
- 虚实相生,构建数智生活|HMS Core. Sparkle应用创新分论坛报名启动
XR技术的发展,为用户带来了全新的体验模式.那么,作为支撑XR发展主要学科之一的图形学,将迎来哪些发展新机遇?移动应用开发者,该如何拥抱3D数字化转型? 7月15日,HDD·HMS Core. Spa ...
- std::thread 六:多线程&单例类
为了避免单例类在多线程中重复的创建,下面提供了两种解决方法: 1.互斥锁+双重检查 2.std::call_once() 方法一:互斥锁+双重检查 #include <iostream> ...
- 重新点亮shell————sed的替换[十]
前言 简单介绍一下sed 和 awk. 正文 这两个和vim的区别: vim 是交互式和 他们是非交互式 vim是文件操作模式与他们是行交互模式 sed sed 的 模式空间. sed的基本工作方式是 ...
- c# checked 和 unchecked
前言 我们知道一个东西在c# 中 比如说int 的max 加1会等于min. 如: static void Main(string[] args) { int i = 2147483647; int ...
- ubuntu 20.04.1 安装 PHP+Nginx
ubuntu 20.04.1 安装 PHP+Nginx 更新源 sudo apt-get update 安装环境包 sudo apt-get -y install nginx sudo apt-get ...
- MAC Book: Operation not permitted
背景: 最近清理系统上的一些无用的文件后,为了release出可用空间,所以还要把.Trash目录下的文件清理才真正清理完,但是ls 查看该目录时发现一直报"operation not pe ...