Sinatra Songs API 教程:使用 Auth0 添加授权保护 CRUD API
作者:API传播员 · 2025-10-22 · 阅读时间:5分钟
本文详细介绍了如何使用Auth0为Sinatra API添加授权功能,包括构建一个名为Sinatra Songs API的歌曲CRUD API,并通过Sinatra框架和Auth0实现API的安全保护。文章涵盖了从项目创建、依赖安装、模型设计到API端点的实现和授权逻辑的添加全过程。
一. 简介
在本教程中,我们将学习如何使用 Auth0 为 Sinatra API 添加授权功能,并保护其端点。我们将构建一个名为 Sinatra Songs API 的歌曲 CRUD API,展示如何通过 Sinatra 框架实现基本 API 功能,同时结合 Auth0 来实现安全性和基于令牌的访问控制。
二. 项目要求
在本项目中,我们将使用以下技术和工具:
三. 构建歌曲 API
1. 创建项目
在终端中创建一个名为 sinatra-auth0-songs-api
的新文件夹,并将其设为当前目录:
mkdir sinatra-auth0-songs-api
cd sinatra-auth0-songs-api
2. 安装 Sinatra
创建 Gemfile
文件,用于管理项目依赖:
# Gemfile
source 'https://rubygems.org'
ruby File.read('.ruby-version').strip
gem 'sinatra', '~> 3.0', '>= 3.0.2'
gem 'puma'
创建 .ruby-version
文件,指定 Ruby 版本:
3.1.2
安装依赖:
bundle install
至此,Sinatra 已成功安装!🎉
3. 创建歌曲模型
在项目中创建 models
文件夹,并添加 song.rb
文件:
# models/song.rb
# frozen_string_literal: true
class Song
attr_accessor :id, :name, :url
def initialize(id, name, url)
@id = id
@name = name
@url = url
end
def to_json(*_args)
{ id: id, name: name, url: url }.to_json
end
end
4. 实现 CRUD API
创建 api.rb
文件,作为 API 主入口:
# api.rb
# frozen_string_literal: true
require 'sinatra'
require 'json'
before do
content_type 'application/json'
end
get '/songs' do
{ todo: :implementation }.to_json
end
get '/songs/:id' do
{ todo: :implementation }.to_json
end
post '/songs' do
{ todo: :implementation }.to_json
end
put '/songs/:id' do
{ todo: :implementation }.to_json
end
delete '/songs/:id' do
{ todo: :implementation }.to_json
end
启动服务器:
ruby api.rb
访问 http://localhost:4567
即可测试 API。
5. 使用 songs.json
填充数据
创建 helpers/songs_helper.rb
文件:
# helpers/songs_helper.rb
# frozen_string_literal: true
require_relative '../models/song'
require 'json'
class SongsHelper
def self.songs
filepath = File.join(File.dirname(__FILE__), '../songs.json')
file = File.read(filepath)
data = JSON.parse(file)['songs']
data.map { |song| Song.new(song['id'], song['name'], song['url']) }
end
end
在 api.rb
中加载数据:
require_relative 'helpers/songs_helper'
songs ||= SongsHelper.songs
get '/songs' do
songs.to_json
end
四. 添加授权功能
1. 配置 Auth0
- 登录 Auth0 管理控制台。
-
创建新的 API:
- 名称:Sinatra Songs API
- 标识符:
https://sinatra-auth0-songs-api
- 签名算法:RS256
记录 标识符 和 域名,稍后使用。
2. 安装依赖
在 Gemfile
中添加:
gem 'dotenv'
gem 'jwt'
安装依赖:
bundle install
创建 .env
文件:
AUTH0_DOMAIN=your-auth0-domain
AUTH0_AUDIENCE=https://sinatra-auth0-songs-api
3. 验证访问令牌
创建 helpers/auth0_client_helper.rb
文件:
# helpers/auth0_client_helper.rb
# frozen_string_literal: true
require 'jwt'
require 'net/http'
class Auth0ClientHelper
Error = Struct.new(:message, :status)
Response = Struct.new(:decoded_token, :error)
def self.domain_url
"https://#{ENV['AUTH0_DOMAIN']}/"
end
def self.decode_token(token, jwks_hash)
JWT.decode(token, nil, true, {
algorithm: 'RS256',
iss: domain_url,
verify_iss: true,
aud: ENV['AUTH0_AUDIENCE'],
verify_aud: true,
jwks: { keys: jwks_hash[:keys] }
})
end
def self.get_jwks
jwks_uri = URI("#{domain_url}.well-known/jwks.json")
Net::HTTP.get_response(jwks_uri)
end
def self.validate_token(token)
jwks_response = get_jwks
return Response.new(nil, Error.new('Unable to verify credentials', :internal_server_error)) unless jwks_response.is_a?(Net::HTTPSuccess)
jwks_hash = JSON.parse(jwks_response.body).transform_keys(&:to_sym)
decoded_token = decode_token(token, jwks_hash)
Response.new(decoded_token, nil)
rescue JWT::VerificationError, JWT::DecodeError
Response.new(nil, Error.new('Bad credentials', 401))
end
end
4. 保护 API 端点
在 api.rb
中添加授权逻辑:
require_relative 'helpers/auth0_client_helper'
helpers do
def authorize!
token = token_from_request
validation_response = Auth0ClientHelper.validate_token(token)
halt validation_response.error.status, { message: validation_response.error.message }.to_json if validation_response.error
end
def token_from_request
authorization_header = request.env['HTTP_AUTHORIZATION']
halt 401, { message: 'Authorization header missing' }.to_json unless authorization_header
schema, token = authorization_header.split
halt 401, { message: 'Invalid authorization header format' }.to_json unless schema.downcase == 'bearer'
token
end
end
before method: %i[post put delete] do
authorize!
end
五. 总结
通过本文,我们学习了如何:
这些步骤为构建安全、可扩展的 Ruby Web API 提供了实践经验。
原文链接: https://auth0.com/blog/add-authorization-to-sinatra-api-using-auth0/
热门推荐
一个账号试用1000+ API
助力AI无缝链接物理世界 · 无需多次注册
3000+提示词助力AI大模型
和专业工程师共享工作效率翻倍的秘密
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- 跨链桥节点混合云 API:5 天扩容方案
- 绕过API,直接部署数据库 – Fly.io
- B站微服务API管理
- API与端点:差异化细分
- 使用 Clerk 与 Express 实现 API 请求身份验证的完整指南
- 翼支付是什么?如何让支付更智能
- API性能:响应时间 vs 吞吐量,哪个更重要?
- 1inch与Blockaid合作完成Shield API开发 – 博客
- 通过 Python 使用 AI真实头发生长 API 实现个性化发型设计
- 金融科技API:揭秘金融领域快速增长的秘密
- DEX 撮合引擎多云灰度发布 API:6 天实战经验
- Spring Boot + GraphQL API 实战:使用 React 和 Auth0 构建安全数据平台