赞
踩
API(应用程序编程接口)就像秘密之门,允许不同的软件程序进行通信。但并不是每个人都应该拥有每扇门的钥匙,就像不是每个软件都应该不受限制地访问每个 API 一样。
这些 API 将从银行的移动应用程序到您最喜欢的社交媒体平台的所有内容连接起来,处理敏感数据并执行关键功能。
如果没有严格的授权协议,应用程序接口可能会被滥用,导致数据泄露、服务中断和用户信任度下降。
因此,这就是 API 授权发挥作用的地方。
API 授权就像一个守门员,确保只有拥有正确钥匙的正确软件才能打开大门,使用里面的资源。有效的 API 授权不仅仅是安全问题,它还能创造无缝、安全的用户体验。它确保授权应用程序只能访问个人信息,并且这些应用程序只能在其允许的范围内执行操作。
在讨论 API 授权最佳实践之前,我们必须了解两个经常被混淆的概念之间的区别:授权和验证。
身份验证就是验证身份。就像通过用户名、密码或生物识别技术确认用户身份一样。
授权则是在身份得到确认后,授予对资源或功能的访问权限。例如,如果身份验证是为了通过前门,那么授权则决定了用户可以访问大楼内的哪些房间和服务。
API授权最佳实践
既然您现在了解了 API 授权的重要性,那就让我们深入探讨一下如何充分利用它的最佳实践吧。
基于令牌的授权,尤其是 JWT(JSON Web 令牌)和 OAuth 令牌,为管理 API 交互提供了一种安全高效的方式。例如
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.'})
细粒度访问控制是一种安全管理方法,可对应用程序的权限和访问权进行详细控制。它能确保用户或服务只拥有所需的访问权限,并遵循最小特权原则。
实施精细度访问控制涉及几个步骤:
例如,如果您有一个 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 会自动更新整个树中的更改。
API 网关是所有 API 请求的前门,为执行安全和操作策略提供了一个集中的场所。例如,API 网关可帮助您实现以下功能
您可以为自己的应用程序选择多种 API Gateway 提供商。例如,亚马逊 API Gateway、Kong 和谷歌 Apigee 都是最受欢迎的 API Gateway 平台。
如果您计划使用 AWS,可以按照其文档中的步骤轻松创建 API 网关。不过,您还需要启用一些额外的功能,以确保 API 网关的安全和高效。
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'] }] } }
对传输中和静态的敏感数据进行加密是保护数据免遭未经授权的访问和泄露的基本安全实践。传输中加密可保护数据在客户端和服务器之间移动时的安全,而静态加密则可保护存储在磁盘或数据库上的数据。
如果使用自己的网络服务器,则必须手动设置和管理 SSL/TLS 证书。首先,需要从可信的证书颁发机构(CA)获取证书,如 Let’s Encrypt、DigiCert、GoDaddy 等。然后,配置服务器以使用 CA。例如,下面是如何使用 Nginx 配置 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 托管的服务。
如何实施静态加密
您可以在数据库级别、应用程序级别或使用基于云的工具实施静态加密。
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
编译:幂简集成
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。