API key学习笔记

API Key 基本上可以认为是一个长字符串,允许 API 消费者(即使用 API 的人)访问受限的功能和数据。它作为一种安全措施,确保了 API 服务能够控制谁有权限访问什么数据,同时也帮助跟踪API的使用情况。生成API key来调用API是为了安全、控制和管理API访问的。这也就是为啥生产环境往往都需要加上key来进行第一步验证了。下面对此进行简单总结:

一、为什么要生成API key?

  1. 身份验证

    • API key用于识别调用者的身份,以确保只有授权的用户才能访问API。
  2. 访问控制

    • API key可以设置不同的权限级别,从而控制用户可以访问哪些API功能。
  3. 使用限制

    • 通过API key,可以对每个用户的API调用次数进行限制,防止滥用。
  4. 监控和记录

    • 使用API key可以跟踪和记录每个用户的API调用情况,以便进行分析和故障排除。
  5. 安全性

    • API key是防止未授权访问和保护数据的第一道防线。

二、如何生成API key?

生成API key的过程可能会因平台或服务提供商的不同而有所差异,但一般步骤如下:

  1. 注册和登录

    • 首先,需要在提供API服务的平台上注册一个账户并登录。
  2. 创建API项目

    • 在大多数平台上,需要创建一个新的API项目或应用程序。在创建过程中,通常会要求提供一些基本信息,如项目名称、描述等。
  3. 生成API key

    • 在项目设置或API设置页面,通常会有一个选项用于生成新的API key。点击生成API key按钮后,平台会生成一个唯一的密钥字符串。
  4. 保存API key

    • 生成的API key通常只会显示一次,所以需要妥善保存。建议将其存储在安全的地方,例如环境变量或安全存储管理工具中。
  5. 配置API key

    • 在实际使用API时,需要将生成的API key包含在API请求的头部、参数或配置文件中,以便进行身份验证。

三、示例

在Google Cloud Platform上生成API key

  1. 登录到Google Cloud Platform控制台。
  2. 创建一个新的项目或选择一个现有项目。
  3. 导航到API和服务 -> 凭据。
  4. 点击“创建凭据”按钮,并选择“API密钥”。
  5. 系统会生成一个新的API密钥。将其复制并保存。

不同平台的具体操作可能会有所不同,但基本流程是相似的。如果你有特定的平台或API需要生成API key,可以提供更多信息,我可以提供更详细的指导。比如大模型openai qwen等提供的API key访问,申请流程差不多,按需付费即可。

基于python和fastapi快速生成一个自己api服务的key,以及如何使用验证
(1)sever端main.py

from fastapi import FastAPI, Depends, HTTPException, Header
from typing import Optional
import uuidapp = FastAPI()# 这里我们将API key存储在内存中,实际应用中应使用数据库或其他安全存储
api_keys = {}# 生成API key并存储
def create_api_key(user: str) -> str:api_key = str(uuid.uuid4())api_keys[api_key] = userreturn api_key# 验证API key
def verify_api_key(x_api_key: str = Header(...)):if x_api_key not in api_keys:raise HTTPException(status_code=401, detail="Invalid API Key")# 生成API key的端点
@app.post("/generate_api_key")
def generate_api_key(user: str):api_key = create_api_key(user)return {"api_key": api_key}# 需要验证API key的端点
@app.get("/secure_endpoint")
def secure_endpoint(api_key: str = Depends(verify_api_key)):return {"message": "You have access to this endpoint"}if __name__ == "__main__":###generate api keyuser="test_user1"user_key=create_api_key(user)print("{}:{}".format(user,user_key))import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

(2)client端

import requests# 生成API key
def generate_api_key(user: str):response = requests.post("http://127.0.0.1:8000/generate_api_key", params={"user": user})return response.json().get("api_key")# 使用API key调用受保护的端点
def call_secure_endpoint(api_key: str):headers = {"X-API-Key": api_key}response = requests.get("http://127.0.0.1:8000/secure_endpoint", headers=headers)return response.json()if __name__ == "__main__":"""user = "test_user"api_key = generate_api_key(user)print("Generated API Key:", api_key)"""###从server端拿到key#api_key="8deb0e23-f2e7-4c01-a306-352bcf7dcf2d"   ##rightapi_key="8deb0e23-f2e7-4c01-a306-352bcf7dcf2a"    ##errorresponse = call_secure_endpoint(api_key)print("Response from secure endpoint:", response)

(3)启动服务
启动FastAPI服务:

uvicorn main:app --reload

运行客户端脚本:

python client.py

(4)其他
验证和区分接口

from flask import Flask, request, jsonifyapp = Flask(__name__)API_KEY = "YOUR_API_KEY"def check_api_key():api_key = request.headers.get('Authorization')if api_key != f"Bearer {API_KEY}":return jsonify({"error": "Unauthorized"}), 401@app.before_request
def before_request():if request.endpoint != 'health_check':  # 忽略不需要验证的端点check_api_key()@app.route('/api/v1/users/<int:user_id>', methods=['GET'])
def get_user(user_id):# 处理获取用户信息的逻辑return jsonify({"user_id": user_id, "name": "John Doe"})@app.route('/api/v1/orders/<int:order_id>', methods=['GET'])
def get_order(order_id):# 处理获取订单信息的逻辑return jsonify({"order_id": order_id, "status": "shipped"})@app.route('/api/v1/products/<int:product_id>', methods=['GET'])
def get_product(product_id):# 处理获取产品信息的逻辑return jsonify({"product_id": product_id, "name": "Widget"})@app.route('/health_check', methods=['GET'])
def health_check():return jsonify({"status": "ok"})if __name__ == '__main__':app.run(debug=True)

通过before_request钩子函数在每个请求之前验证API密钥,并通过不同的URL路径来区分多个接口。这样可以确保在访问API接口前都进行了验证,并且可以清楚地区分每个接口调用。

生成key的其他方式

  • 使用UUID生成
    UUID(Universally Unique Identifier)是常用的生成唯一标识符的方法。UUID是128位长的数字,生成的概率极低。
import uuiddef generate_uuid_api_key():return str(uuid.uuid4())
  • 使用哈希函数
    哈希函数(如SHA-256)可以生成固定长度的字符串,可以用于生成API key。
import hashlib
import timedef generate_hash_api_key():return hashlib.sha256(str(time.time()).encode('utf-8')).hexdigest()
  • 使用加密随机数

加密随机数生成器可以生成高强度的随机字符串,用于API key。

import secretsdef generate_secure_api_key():return secrets.token_urlsafe(32)
  • 使用令牌生成库
    一些第三方库专门用于生成令牌或API key,如PyJWT、OAuthlib等。
import jwt
import datetimedef generate_jwt_api_key(secret_key, user_id):payload = {'user_id': user_id,'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)  # 过期时间}return jwt.encode(payload, secret_key, algorithm='HS256')
  • 基于用户信息和时间戳
    结合用户信息和时间戳生成API key,可以确保每个API key的唯一性,同时包含一些有用的信息。
import base64
import hashlib
import timedef generate_user_based_api_key(user_id):raw_key = f"{user_id}:{time.time()}"return base64.urlsafe_b64encode(hashlib.sha256(raw_key.encode('utf-8')).digest()).decode('utf-8')

选择合适的生成方法

  • UUID生成:适合一般场景,简单易用。
  • 哈希函数生成:适合需要固定长度和散列特性的场景。
  • 加密随机数生成:适合高安全性要求的场景。
  • 令牌生成库:适合需要嵌入额外信息和控制过期时间的场景。
  • 用户信息和时间戳:适合需要基于特定信息生成API key的场景。

选择生成API key的方法时,应考虑以下因素:

  • 唯一性:确保生成的API key是唯一的,不会重复。
  • 安全性:API key应难以预测或伪造,特别是对于敏感操作。
  • 长度和格式:根据使用场景选择合适的长度和格式,如Base64编码或十六进制字符串。
  • 易用性:API key应易于生成和管理,适合应用需求。

四、其他

在日常对API key的使用过程中,需要注意以下几点:

  • 限制API Key权限:如果可能的话,限制你的 API Key 的权限只包括你真正需要的服务和操作。
  • 定期轮换API Key:为减少安全风险,定期更换 API Key 可以是个不错的习惯。
  • 监控API使用:留意异常的API调用模式或过量的流量,这可能表明你的 Key 已经泄露。
  • 处理错误:合理处理 API 调用中可能出现的错误,例如限流(rate limiting)错误,可以提高用户体验。
  • API Hub:提供各式各样开放 API 可直接调用。
  • 管理自己的API key:这里推荐一个开源项目https://github.com/songquanpeng/one-api ,可以对自己开放和使用的API key进行管理,比如使用次数权限等。

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

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

相关文章

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

创新指南 | 5个行之有效的初创企业增长策略

本文探讨了五种初创企业实现快速增长的有效策略&#xff1a;利用网络效应通过激励和资本化用户增长&#xff1b;通过持续提供高质量内容建立信任和权威的内容营销&#xff1b;利用简单有效的推荐计划扩展用户群&#xff1b;采用敏捷开发方法快速适应市场变化和客户反馈&#xf…

Codeforces Round 950 (Div. 3) A B C D E

A. Problem Generator time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output Vlad is planning to hold m m m rounds next month. Each round should contain one problem of difficulty levels ‘A’, ‘B’…

Java:JDK8 GC中ParNew和CMS的问题说明

JDK8中常用如下的垃圾收集器&#xff0c;它们分别运用在年轻代和老年代&#xff1a; ParNew : 年轻代垃圾收集器&#xff0c;多线程&#xff0c;采用标记—复制算法。 CMS&#xff1a;老年代的收集器&#xff0c;全称&#xff08;Concurrent Mark and Sweep&#xff09;&#…

[消息队列 Kafka] Kafka 架构组件及其特性(二)Producer原理

这边整理下Kafka三大主要组件Producer原理。 目录 一、Producer发送消息源码流程 二、ACK应答机制和ISR机制 1&#xff09;ACK应答机制 2&#xff09;ISR机制 三、消息的幂等性 四、Kafka生产者事务 一、Producer发送消息源码流程 Producer发送消息流程如上图。主要是用…

国自然基金的检索

&#xff08;1&#xff09;网址 跳转国自然基金网址&#xff1a;https://www.nsfc.gov.cn/ &#xff08;2&#xff09;查询入口 &#xff08;3&#xff09;进行查询

【LeetCode 滑动窗口】LC_3_无重复字符的最长子串

文章目录 1. 无重复字符的最长子串 1. 无重复字符的最长子串 题目链接&#x1f517; &#x1f34e;题目思路&#xff1a;&#x1f427;① 滑动窗口的思想&#xff1b;&#x1f427;② 用什么来维护窗口呢 &#xff1f; 用 双指针 和 unordered_set来维护&#xff0c;为什么呢…

标题:深入探索Linux中的`ausyscall`

标题&#xff1a;深入探索Linux中的ausyscall&#xff08;注意&#xff1a;ausyscall并非Linux内核标准命令&#xff0c;但我们可以探讨类似的概念&#xff09; 在Linux系统中&#xff0c;系统调用&#xff08;syscall&#xff09;是用户空间程序与内核空间进行交互的一种重要…

Git介绍及应用

1.简介 Git是一个分布式版本控制器&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库:开发人员自己电脑上的Git仓库远程仓库:远程服务器上的Git仓库 2.执行流程 3.Git代码托管服务…

【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统

作品功能 这个智能温度控制系统基于MSP430单片机设计&#xff0c;能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括&#xff1a; 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…

【经验分享】嵌入式入坑经历(选段)

文章目录 你现在的工作中所用到的专业知识有哪些呢&#xff1f;为什么想转行了&#xff1f;后来为什么从事了嵌入式行业呢?你对嵌入式的兴趣是何时培养起来的?你是怎么平衡兴趣爱好和工作的关系的?平时做的事情对你现在的工作有哪些帮助?对于有志学习嵌入式开发的在校大学生…

【96】write combine机制介绍

前言 这篇文章主要介绍了write combine的机制 一、write combine的试验 1.系统配置 &#xff08;1&#xff09;、CPU&#xff1a;11th Gen Intel(R) Core(TM) i7-11700 2.50GHz &#xff08;2&#xff09;、GPU&#xff1a;XX &#xff08;3&#xff09;、link status&am…

MySQL(四) - SQL优化

一、SQL执行流程 MySQL是客户端-服务器的模式。一条SQL的执行流程如下&#xff1a; 在执行过程中&#xff0c;主要有三类角色&#xff1a;客户端、服务器、存储引擎。 大致可以分为三层&#xff1a; 第一层&#xff1a;客户端连接到服务器&#xff0c;构造SQL并发送给服务器…

Python | 排队取奶茶

队列的基本概念&#xff08;队头、队尾&#xff09;和特点&#xff08;先入先出&#xff09; 在 Python 语言中&#xff0c;标准库中的queue模块提供了多种队列的实现&#xff0c;比如普通队列和优先级队列&#xff0c;因此你可以使用queue.Queue类来创建队列&#xff0c;不过…

惠海 H5528 升降压芯片 12V24V36V48V60V75V LED恒流驱动IC 调光细腻顺滑无阶梯感

惠海H5528是一款升压、降压、升压降压的LED恒流驱动IC&#xff0c;其具备宽范围调光比且无频闪调光的特性&#xff0c;使得它在智能照明、Dali调光、0~10V调光、摄影灯照明以及补光灯照明等多种应用中具有广泛的应用前景。 这款芯片支持降压、升压和升降压拓扑的应用&#xff0…

C++面向对象程序设计 - 文件操作与文件流

在实际应用中&#xff0c;常以磁盘文件作为对象&#xff0c;即能从磁盘文件读取数据&#xff0c;也能将数据输出到磁盘文件&#xff0c;磁盘是计算机的外部存储器&#xff0c;能够长期保留信息&#xff0c;能读能写&#xff0c;可以刷新重写等等。 在C中&#xff0c;文件操作通…

Flink Rest Basic Auth - 安全认证

背景 公司目前需要将Flink实时作业云化,构建多租户实时计算平台。目前考虑为了资源高效利用,并不打算为每个租户部署一套独立的Kubernetes集群。也就意味着多个租户的作业可能会运行在同一套kubernets集群中。此时实时作业的任务就变的很危险,因为网络可能是通的,就会存在…

106.网络游戏逆向分析与漏洞攻防-装备系统数据分析-在UI中显示装备与技能信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

新媒体暴力起号必备因素!沈阳新媒体运营培训学校

1周涨粉10w&#xff1f;这对普通人来说可以说是天文数字&#xff0c;但只要掌握方式方法&#xff0c;普通人也能做到&#xff01; 面试经验丰富的人都深知&#xff0c;给面试官留下的第一印象相当重要&#xff0c;几乎决定了80%的面试机会。标题也是如此&#xff0c;在完成一篇…

Android SBL是什么

Android SBL&#xff08;Secondary Bootloader&#xff09;是Android系统中一个关键的组成部分&#xff0c;它属于Bootloader的二级引导程序。以下是关于Android SBL的详细解释&#xff1a; 定义&#xff1a; SBL是Secondary Bootloader的缩写&#xff0c;中文称为第二级引导程…