如何为您的网站设计安全的Web API访问?-CSDN博客

当我们向用户开放Web API访问时,我们需要确保每个API调用都经过身份验证。这意味着用户必须是其所声称的身份。

在本文中,我们探讨了两种常见的方式:

1.基于令牌的身份验证2.基于HMAC(哈希消息认证码)的身份验证

工作方式

下面的图表说明了它们的工作方式。

基于令牌的身份验证

步骤1-用户将其密码输入客户端,客户端将密码发送到身份验证服务器。

步骤2-身份验证服务器验证凭据并生成一个具有到期时间的令牌。

步骤3和4-现在,客户端可以发送带有令牌的请求来访问服务器资源。此访问在令牌过期之前有效。

基于HMAC的身份验证

该机制通过使用哈希函数(SHA256或MD5)生成消息认证码(签名)。

步骤1和2-服务器生成两个密钥,一个是公共APP ID(公钥),另一个是API密钥(私钥)。

步骤3-现在我们在客户端上生成一个HMAC签名(hmac A)。此签名是使用图表中列出的一组属性生成的。

步骤4-客户端使用hmac A在HTTP头中发送请求以访问服务器资源。

步骤5-服务器接收包含请求数据和身份验证标头的请求。它从请求中提取必要的属性,并使用存储在服务器端的API密钥生成签名(hmac B)。

步骤6和7-服务器比较hmac A(在客户端上生成)和hmac B(在服务器端生成)。如果它们匹配,则请求的资源将返回给客户端。

几个常见的Web API:

1.Twitter API - 允许开发者构建应用程序,从Twitter上读取、发布和管理推文,并与Twitter上的其他用户进行交互。2.Facebook Graph API - 允许开发者创建应用程序,访问Facebook上的用户信息、朋友列表、帖子、照片、视频等数据。3.Google Maps API - 允许开发者将Google Maps嵌入到自己的网站或应用程序中,并访问地图、路线、位置等数据。4.YouTube Data API - 允许开发者创建应用程序,访问YouTube上的视频、频道、播放列表和评论等数据。5.Amazon Web Services (AWS) API - 允许开发者使用AWS上的各种云服务,如云存储、数据库、计算、分析、安全等。6.Twilio API - 允许开发者将SMS、语音和视频功能添加到自己的应用程序中,用于通信和交互。

这些API提供了广泛的功能和数据,使得开发者可以构建更加强大和复杂的应用程序。

代码示例

这里提供一个Python Flask框架中使用Token-Based Authentication的代码示例:

other 复制代码
from flask import Flask, jsonify, request
from datetime import datetime, timedelta
import jwt


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'


# Authentication endpoint
@app.route('/auth', methods=['POST'])
def authenticate():
    username = request.json.get('username')
    password = request.json.get('password')


    # Authenticate user here, e.g. check credentials against a database


    # If user is authenticated, generate JWT token with expiration time
    token_payload = {
        'username': username,
        'exp': datetime.utcnow() + timedelta(minutes=30)
    }
    token = jwt.encode(token_payload, app.config['SECRET_KEY'], algorithm='HS256')


    return jsonify({'access_token': token.decode('utf-8')}), 200


# Protected endpoint that requires authentication
@app.route('/protected', methods=['GET'])
def protected():
    # Get token from Authorization header
    auth_header = request.headers.get('Authorization')
    if auth_header:
        token = auth_header.split(" ")[1]
    else:
        return jsonify({'message': 'Authorization header is missing'}), 401


    # Verify token signature and expiration time
    try:
        token_payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
        username = token_payload.get('username')
    except jwt.ExpiredSignatureError:
        return jsonify({'message': 'Token has expired'}), 401
    except jwt.InvalidTokenError:
        return jsonify({'message': 'Invalid token'}), 401


    # If token is valid, return protected resource
    return jsonify({'message': f'Hello, {username}! This is a protected resource.'}), 200

在上面的代码示例中,/auth是用于进行用户认证并生成JWT token的API端点,/protected是需要用户认证才能访问的受保护端点。在进行认证时,用户需要提供用户名和密码,如果认证成功,服务器将生成一个包含用户名和过期时间的JWT token,返回给客户端。在访问受保护端点时,客户端需要将JWT token添加到HTTP请求头的Authorization字段中,并将其发送到服务器。服务器会验证该JWT token的签名和过期时间,如果验证通过,则返回受保护的资源。

总结

当我们开放网站API接入时,我们需要确保每个API调用都是经过身份验证的。这意味着用户必须是他们声称的那个人。在本文中,我们探讨了两种常见的身份验证方式:基于令牌的身份验证和基于HMAC的身份验证。

无论使用哪种身份验证方式,都需要进行严格的安全措施来确保API接入的安全性。

相关推荐
架构源启3 小时前
文档接入与智能解析:基于 Spring AI 1.1.x 的多格式解析、版面理解与结构化抽取
java·人工智能·spring
大模型码小白7 小时前
JAVA 集合框架进阶:List 与 Set 的深度解析与实战
java·开发语言·人工智能·windows·语言模型·list·ai编程
名字还没想好☜7 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
音符犹如代码8 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·spring boot·guava
前端炒粉8 小时前
手撕小汇总
java·前端·javascript
唐青枫8 小时前
Java Kafka 实战指南:从 Topic、分区到 Spring Boot 可靠消息处理
java
脱胎换骨-军哥9 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++
我是唐青枫10 小时前
Java Netty 实战指南:从 NIO 线程模型到 TCP 编解码和心跳机制
java·tcp/ip·nio
小白说大模型10 小时前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain
风起洛阳@不良使11 小时前
springIOC创建对象的方式--spring容器中的注入
java·spring