API 授权最佳实践

news2024/12/22 13:01:30

API(应用程序编程接口)就像秘密之门,允许不同的软件程序进行通信。但并不是每个人都应该拥有每扇门的钥匙,就像不是每个软件都应该不受限制地访问每个 API 一样。

这些 API 将从银行的移动应用程序到您最喜欢的社交媒体平台的所有内容连接起来,处理敏感数据并执行关键功能。

如果没有严格的授权协议,应用程序接口可能会被滥用,导致数据泄露、服务中断和用户信任度下降。

因此,这就是 API 授权发挥作用的地方。

API 授权就像一个守门员,确保只有拥有正确钥匙的正确软件才能打开大门,使用里面的资源。有效的 API 授权不仅仅是安全问题,它还能创造无缝、安全的用户体验。它确保授权应用程序只能访问个人信息,并且这些应用程序只能在其允许的范围内执行操作。

了解API授权

在讨论 API 授权最佳实践之前,我们必须了解两个经常被混淆的概念之间的区别:授权和验证。

身份验证就是验证身份。就像通过用户名、密码或生物识别技术确认用户身份一样。

授权则是在身份得到确认后,授予对资源或功能的访问权限。例如,如果身份验证是为了通过前门,那么授权则决定了用户可以访问大楼内的哪些房间和服务。

API授权最佳实践

既然您现在了解了 API 授权的重要性,那就让我们深入探讨一下如何充分利用它的最佳实践吧。

1.使用基于令牌的授权(JWT、OAuth 令牌)

基于令牌的授权,尤其是 JWT(JSON Web 令牌)和 OAuth 令牌,为管理 API 交互提供了一种安全高效的方式。例如

  • 令牌支持无状态身份验证,这意味着服务器不需要为每个用户维护会话状态,从而实现更好的可扩展性。
  • 令牌可以通过各种方式安全传输,并且比传统的基于会话的身份验证更不易受到 CSRF 攻击。
  • 令牌可以跨域使用,这使其成为微服务架构和单点登录 (SSO) 应用程序的理想选择。
  • 令牌(尤其是 OAuth 令牌)可以包含范围和权限,从而提供对经过身份验证的用户操作的精确控制。

如何使用 JWT 实现基于令牌的授权

JWT 通常在用户成功验证后生成。它们包含一个包含用户信息和可能的权限的有效载荷。您可以使用 Node.js 中的 jsonwebtoken 或 Python 中的 PyJWT 等库实现 JWT 授权。

首先,您需要生成 JWT 标记。下面是使用 PyJWT 的方法:

import jwtfrom datetime import datetime, timedeltasecret_key = 'YOUR_SECRET_KEY'payload = {    'sub': user_id,    'iat': datetime.utcnow(),    'exp': datetime.utcnow() + timedelta(days=1)}token = jwt.encode(payload, secret_key, algorithm='HS256')

然后,需要对每个请求进行验证,以确定用户是否被允许执行请求。令牌通常会在每个请求的授权头中发送。服务器可以使用秘钥解码 JWT 并进行验证。如果有效,服务器就会处理请求;如果无效,服务器就会返回错误信息。

from flask import Flask, request, jsonifyimport jwtimport datetimeapp = Flask(name)SECRET_KEY = "your_secret_key"  # Replace with your secret keySample route that requires token-based authorization@app.route('/protected', methods=['GET'])def protected():    token = request.headers.get('Authorization')    if not token:        return jsonify({'message': 'Token is missing!'}), 403    try:        # Decoding the token        data = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])        # You can use the data in the token as needed, for example:        # user_id = data['user_id']    except jwt.ExpiredSignatureError:        return jsonify({'message': 'Token has expired!'}), 403    except jwt.InvalidTokenError:        return jsonify({'message': 'Invalid token!'}), 403    # Token is valid, process the request    return jsonify({'message': 'Token is valid! You have access to protected routes.'})

2.实施细粒度访问控制

细粒度访问控制是一种安全管理方法,可对应用程序的权限和访问权进行详细控制。它能确保用户或服务只拥有所需的访问权限,并遵循最小特权原则。

如何实施细粒度访问控制:

实施精细度访问控制涉及几个步骤:

  • 定义角色和权限:识别系统中不同的用户角色并定义每个角色的具体操作。
  • 使用基于角色的访问控制 (RBAC):实施 RBAC,根据角色授予资源访问权限。每个角色都被分配了特定的权限。
  • 考虑基于属性的访问控制 (ABAC):对于更复杂的场景,可以使用 ABAC,其中访问决策基于属性(用户、资源、环境)的组合。

例如,如果您有一个 API,其中管理员用户的访问权限不同。您可以使用可在应用程序中重复使用的独立组件来实现访问控制机制。

您所要做的就是:

首先,创建一个名为 “authorizer “的 Node.js 组件,让您可以使用命令来实现验证逻辑:

bit create node util/authorizer

如果操作正确,就会看到输出结果:

接下来,实现授权逻辑:

export function authorizer(userId: string) { // Implement logic to retrieve the user's role if (userId === 'U001') {   return "admin"; } return "customer"}

接下来,使用命令创建一个 Express App:

bit create express-app api

您将看到输出结果:

接下来,让我们通过更新 mock-route.ts 将授权器连接到应用程序。一开始,你会看到这样的内容

让我们添加一个新的中间件:

这将确保您的授权器组件在调用实际业务逻辑之前运行。运行 API 后,您应该会看到以下输出:

通过函数链,我们实现了基于角色的访问控制。装饰器会检查用户的角色是否符合端点所需的角色。如果不匹配,则返回拒绝访问消息。

当你不断更新授权逻辑和更新应用程序时,比特的 CI 服务器–Ripple CI 会自动更新整个树中的更改。

3. 安全API网关配置

API 网关是所有 API 请求的前门,为执行安全和操作策略提供了一个集中的场所。例如,API 网关可帮助您实现以下功能

  • 增强的安全性:提供额外的安全层,防止 DDoS 攻击、未经授权的访问和 API 滥用等威胁。
  • 速率限制和节流:防止 API 过度使用并确保用户之间的公平使用。
  • 数据转换和验证:确保传入数据符合预期的格式和标准。

如何实施安全 API 网关配置:

您可以为自己的应用程序选择多种 API Gateway 提供商。例如,亚马逊 API Gateway、Kong 和谷歌 Apigee 都是最受欢迎的 API Gateway 平台。

如果您计划使用 AWS,可以按照其文档中的步骤轻松创建 API 网关。不过,您还需要启用一些额外的功能,以确保 API 网关的安全和高效。

  • 设置速率限制— 在 AWS 管理控制台中,导航到 Amazon API Gateway,选择您的 API,然后转到保护选项卡下的限制部分。在那里,您可以设置速率和突发限制。

  • 启用 SSL/TLS — 确保 API Gateway 的自定义域名与 AWS Certificate Manager 中的 SSL/TLS 证书关联。
  • 实施 IP 限制— 使用 AWS Lambda 授权方验证传入请求的 IP 地址。部署该功能后,您可以通过在授权选项卡中为 API 网关创建新的授权者来选择该功能。以下是 Python 中用于限制 IP 的示例 Lambda 函数:
import jsondef lambda_handler(event, context):    ip_address = event['requestContext']['identity']['sourceIp']    allowed_ips = ['192.168.1.1']  # List of allowed IPs    # Add logic here to check if the ip_address is in allowed_ips or not    if ip_address not in allowed_ips:        raise Exception('Unauthorized')    return {        'principalId': 'user',        'policyDocument': {            'Version': '2012-10-17',            'Statement': [{                'Action': 'execute-api:Invoke',                'Effect': 'Allow',                'Resource': event['methodArn']            }]        }    }
  • 启用 CloudWatch Logs — 在 AWS 管理控制台中,转到 API 网关的设置。在CloudWatch 设置部分中,选中启用CloudWatch Log选项。将日志级别设置为INFO以记录所有请求和响应,或将日志级别设置为ERROR以仅记录错误响应。

4. 加密传输中和静态的敏感数据

对传输中和静态的敏感数据进行加密是保护数据免遭未经授权的访问和泄露的基本安全实践。传输中加密可保护数据在客户端和服务器之间移动时的安全,而静态加密则可保护存储在磁盘或数据库上的数据。

如何在传输中实施加密

如果使用自己的网络服务器,则必须手动设置和管理 SSL/TLS 证书。首先,需要从可信的证书颁发机构(CA)获取证书,如 Let’s Encrypt、DigiCert、GoDaddy 等。然后,配置服务器以使用 CA。例如,下面是如何使用 Nginx 配置 SSL:

  • 修改 Nginx 配置文件(通常位于/etc/nginx/nginx.conf或/etc/nginx/sites-available/your_site)。
  • 在服务器块中添加 SSL 设置:
server {    listen 443 ssl;    server_name yourdomain.com;    ssl_certificate /path/to/your/fullchain.pem; # Path to your fullchain.pem from CA    ssl_certificate_key /path/to/your/privkey.pem; # Path to your private key from CA    # Strong encryption settings (consider using recommendations from Mozilla's SSL Configuration Generator)    ssl_protocols TLSv1.2 TLSv1.3;    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';        # Other server configurations...}

如果你使用的是云服务,它们会为处理 SSL/TLS 提供完全托管的服务。例如,您可以使用 AWS 证书管理器来管理 AWS 托管的服务。

如何实施静态加密

您可以在数据库级别、应用程序级别或使用基于云的工具实施静态加密。

  • 数据库级加密:许多现代数据库提供内置加密功能。例如:
  • SQL Server:透明数据加密。
  • MySQL:InnoDB 表空间加密。
  • MongoDB:加密存储引擎。
  • 应用程序级加密:应用程序级加密应用于高敏感数据,甚至在存储到数据库之前对其进行加密。您可以使用密码学等库来实现此目的:
from cryptography.fernet import Fernet# Generate a keykey = Fernet.generate_key()cipher_suite = Fernet(key)# Encrypt dataencrypted_data = cipher_suite.encrypt(b"Sensitive Data")# Decrypt datadecrypted_data = cipher_suite.decrypt(encrypted_data)

最后的想法

强大的应用程序接口授权对于确保数字资产安全和维护用户信任至关重要。

通过实施本文讨论的最佳实践,开发人员可以显著增强应用程序的 API 安全性,同时确保合规性并防范各种网络威胁。

原文链接:Best-Practices for API Authorization

编译:幂简集成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python机器人编程——用pytorch实现六轴机械臂的正向和逆向数值解算,及python算法解析

目录 一、前言二、实现原理2.1正向建模2.2张量化2.3绘制3D动画及操作UI 三、结论四、python源码PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 一、前言 前面对六轴(或多轴)机械臂进行了一些研究&#x…

SCI一区级 | Matlab实现BO-Transformer-LSTM时间序列预测

SCI一区级 | Matlab实现BO-Transformer-LSTM时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-LSTM时间序列预测效果一览基本介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/caef5d232c4b436ebb01d717819d5ff1.png)程序设计参考资料 效果一览 基本介绍…

C语言的数据结构:图的基本概念

前言 之前学过了其它的数据结构,如: 集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。 线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个,如线性表、栈、队列,每一个节点和其它节点之间的关系 一个对一个…

【Linux】生物信息学常用命令

参考资料来自生信技能树 先输入echo export PS1"[\033]2;\h:\u \w\007\033[33;1m]\u \033[35;1m\t\033[0m [\033[36;1m]\w[\033[0m]\n[\e[32;1m]$ [\e[0m]" >> ~/.bashrc 再输入source ~/.bashrc就能够让命令字体带上颜色,同时命令将会在下一行开…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法,解析spark参数,调用submit方法 3.在submit方法里调用doRunMain方法,最终调用r…

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索 1、视频广场1.1、搜索筛选1.2、状态记录1.3、播放1.4、视频信息1.5、回放入口 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 1.1、搜索筛选 可以下拉筛选 在线、离线 &a…

小红书 达芬奇:生活问答 AI 机器人

小红书去年 9 月开始内测的生活问答 AI 机器人:达芬奇,现在可以在小红书 APP 上用了 得益于小红书平台的特性,该助手擅长吃、住、宠、喝、学等等各类生活知识,目前还在搞活动,写评测笔记最高得 666 元

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流&#xff…

LinkedList底层原理

LinkedList特有方法 源码分析

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存,提前响应,降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

Python基础002

Python数据类型 1、字符串&#xff08;str&#xff09; str3 """I miss you so much""" print("str3 ", str3,type(str3)) str3 I miss you so much <class str>2、整数&#xff08;int&#xff09; str1 55 print(&quo…

什么是定时器?

前言&#x1f440;~ 上一章我们介绍了阻塞队列以及生产者消息模式&#xff0c;今天我们来讲讲定时器 定时器 标准库中的定时器 schedule()方法 扫描线程 手动实现定时器 任务类 存储任务的数据结构 定时器类 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&am…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法&#xff1a; CREATE DATABASE dbname; 使用 createdb 命令来创建 语法&#xff1a; createdb [option...] [dbname [description]] 参数说明&#xff1a; dbname&#xff1a;要创建的数据库名。 description&…

手机电脑能实现无缝共享的记事软件是什么

在这个信息爆炸的时代&#xff0c;记事软件已成为我们日常生活中不可或缺的工具。然而&#xff0c;我曾深深困扰于手机与电脑之间记事内容无法无缝共享的问题。 记得有一次&#xff0c;我在手机上匆匆记下了一个重要的想法&#xff0c;打算稍后在电脑上展开。但当我坐在电脑前…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

C语言的数据结构:图的操作

&#x1f6fa;图的遍历&#xff1a; 注意&#xff1a;在遍历的过程中&#xff0c;可能会出现 回路 ( 已经访问过的节点还要重新访问一次 ) \color{orange}回路(已经访问过的节点还要重新访问一次) 回路(已经访问过的节点还要重新访问一次). 当从A开始访问时&#xff0c;先访问…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

秒懂设计模式--学习笔记(4)【创建篇-工厂方法模式】

目录 3、工厂方法模式3.1 介绍3.2 工厂的多元化与专业化3.3 游戏角色建模(建模)3.4 简单工厂不简单(实例化、初始化)3.5 制定工业制造标准3.6劳动分工 3、工厂方法模式 3.1 介绍 程序设计中的工厂类往往是对对象构造、实例化、初始化过程的封装&#xff0c;而工厂方法&#x…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录 Python 库及 MindSpore 相关模块和类的导入 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 Python 库及 MindSpore 相关模块和类的导入 Python 中的 numpy 库被成功导入&#xff0c;并简称为 np。numpy 在科学计算领域应用广泛&#x…