参考下面的连接

使用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 授权登录的更多相关文章

  1. laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效

    laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...

  2. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  3. spring cloud+.net core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  4. [转] Android:微信授权登录与微信分享全解析

    https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...

  5. 微信授权登录mock(在没有真实微信账号的情况下测试大量微信账户授权登录的情况)

    场景介绍 对于构建在微信公众号的系统,帐号体系往往使用微信授权登录(如各类微信商城应用系统). 这样操作不仅可以实现静默注册,对用户几乎是无感的,同时也达到了区分用户,获取用户基本信息(头像,昵称等) ...

  6. spring jwt springboot RESTful API认证方式

    RESTful API认证方式 一般来讲,对于RESTful API都会有认证(Authentication)和授权(Authorization)过程,保证API的安全性. Authenticatio ...

  7. Spring Boot+Spring Security+JWT 实现 RESTful Api 权限控制

    摘要:用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的.现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能 ...

  8. 基于Shiro,JWT实现微信小程序登录完整例子

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...

  9. 通过 SCF Component 轻松构建 REST API,再也不用熬夜加班了

    本教程将分享如何通过 Serverless SCF Component .云函数 SCF 及 API 网关组件,快速构建一个 REST API 并实现 GET/PUT 操作. 当一个应用需要对第三方提 ...

  10. Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一)

    标题 Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一) 技术 Spring Boot 2.Spring Security 5.JWT 运行环境 ...

随机推荐

  1. linux 禁用休眠,挂起,睡眠

    参照 https://www.cnblogs.com/minseo/p/13557947.html 禁用休眠前查看状态 systemctl status sleep.target suspend.ta ...

  2. 5 JavaScript变量提升

    5 变量提升 看以下代码, 或多或少会有些问题的. function fn(){ console.log(name); var name = '大马猴'; } fn() 发现问题了么. 这么写代码, ...

  3. #树状数组#洛谷 5677 [GZOI2017]配对统计

    题目 分析 考虑处理出所有右端点的能够匹配的左端点,然后用树状数组离线查询 代码 #include <cstdio> #include <cctype> #include &l ...

  4. C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础

    访问结构体成员 要访问结构体的成员,请使用点语法 (.): // 创建名为 myStructure 的结构体 struct MyStructure { int myNum; char myLetter ...

  5. Docker学习路线1:介绍

    Docker是什么? Docker是一个开源平台,通过将应用程序隔离到轻量级.可移植的容器中,自动化应用程序的部署.扩展和管理.容器是独立的可执行单元,封装了运行应用程序所需的所有必要依赖项.库和配置 ...

  6. 深入解析C++的auto自动类型推导

    关键字auto在C++98中的语义是定义一个自动生命周期的变量,但因为定义的变量默认就是自动变量,因此这个关键字几乎没有人使用.于是C++标准委员会在C++11标准中改变了auto关键字的语义,使它变 ...

  7. react native 0.73 配置 react-native-fs

    安装react-native-fs npm npm install react-native-fs --save yarn yarn add react-native-fs 安卓配置 android/ ...

  8. Graph Embedding-DeepWalk

    一言以蔽之,DeepWalk是在graph上,通过随机游走来产生一段定长的结点序列,并将其通过word2vec的方式获得各个结点的embedding的算法. DeepWalk一共涉及以下几个内容: 随 ...

  9. centos6.5下安装配置apache2.4.9

    centos6.5下安装配置apache2.4.9 摘要: 需要下载的包 apr-1.5.0.tar.gz apr-util-1.5.3.tar.gz pcre-8.33.tar.gz httpd-2 ...

  10. 【Windbg Preview】Failed to load data access DLL, 0x80004005

    最近使用Windbg的时候一直在用Preview版本,感觉解析一下就能直接加载起环境来太爽了.不过最近遇到一个dump加载不起来了. 但是最近一次加载却失败了,尝试了很久也不行 Failed to l ...