🚗 Tesla 数据接入全流程(一):🔑 Fleet API & Owner API 开发实践
本文是 “Tesla 数据接入全流程” 系列第一篇,聚焦 Tesla OAuth2 鉴权流程,通过一个 Python 单文件实现演示 Fleet API 与 Owner API 的接入方法。
下一篇将讲解如何利用 Access Token 采集车辆数据并进行可视化。
车已经开了一年了,数据是没有问题的,而且很时候可以解决车主部分问题,所以现在才出来写关于Tesla的博客
当前项目在线网址: https://tesla.bigbey.com/
📚 目录
- 📝 前言
- 🆚 一、背景 & 为什么要区分 Fleet API / Owner API
- 🔐 二、OAuth2 + PKCE 登录流程详解
- 🛠 三、Flask 单文件实现亮点拆解
- ⚙ 3.1 配置参数安全管理
- 🎯 3.2 PKCE 参数生成逻辑
- 🌐 3.3 登录跳转逻辑设计
- 🪝 3.4 Token 交换及错误处理
- 💻 四、本地运行演练体验
- 📌 五、总结 & 下一篇预告
📝 前言
Tesla 官方提供了两套 API —— Owner API 与 Fleet API,它们的应用场景、权限范围、安全策略均不同。
本文将通过 Python Flask 单文件 Demo 带你跑通 从登录授权 → Token 获取 的完整流程。
🆚 一、背景 & API 差异
API 类型 | 面向对象 | 特点 |
---|---|---|
Owner API | 👤 个人车主端 | 简单易用,历史悠久,适合快速原型 |
Fleet API | 🏢 企业/车队 | 权限细粒度、支持更多数据与命令,安全性更高 |
💡 建议:
- 如果是长期稳定的数据采集或车队管理,优先 Fleet API
- 如果是个人快速尝试,Owner API 更轻量
🔐 二、OAuth2 + PKCE 登录流程详解
- 生成 PKCE 参数
code_verifier
→ 随机字符串code_challenge
→SHA256(code_verifier)
的 Base64 URL 安全编码
- 构建授权 URL
- 拼接
client_id
、redirect_uri
、scope
、code_challenge
- 拼接
- 用户登录授权
- Tesla 回调携带
code
&state
- Tesla 回调携带
- 交换 Token
- 后端用
code
+code_verifier
请求access_token
/refresh_token
- 后端用
🛠 三、Flask 单文件实现亮点拆解
⚙ 3.1 配置参数安全管理
FLEET_CLIENT_ID = os.getenv('FLEET_CLIENT_ID', '<申请值>')
FLEET_CLIENT_SECRET = os.getenv('FLEET_CLIENT_SECRET', '<申请值>')
FLEET_REDIRECT_URI = os.getenv('FLEET_REDIRECT_URI', 'https://your-domain/callback')
🔒 建议敏感信息全部走环境变量。
🎯 3.2 PKCE 参数生成逻辑
def generate_pkce_params():
code_verifier = base64.urlsafe_b64encode(secrets.token_bytes(32)).decode().rstrip('=')
code_challenge = base64.urlsafe_b64encode(
hashlib.sha256(code_verifier.encode()).digest()
).decode().rstrip('=')
return code_verifier, code_challenge
安全且简洁的实现。
🌐 3.3 登录跳转逻辑设计
@app.route('/login')
def login():
# 根据 type 区分 Fleet / Owner 配置
# 生成 PKCE & state 存入 session
# 跳转至 Tesla 授权页
🪝 3.4 Token 交换及错误处理
def exchange_token(code, code_verifier):
token_data = {
'grant_type': 'authorization_code',
'client_id': session['client_id'],
'code': code,
'code_verifier': code_verifier,
'redirect_uri': session['redirect_uri'],
}
if session['api_type'] == 'fleet':
token_data['client_secret'] = FLEET_CLIENT_SECRET
resp = requests.post(TESLA_TOKEN_URL, data=token_data, timeout=30)
📢 含超时、状态码异常等完整异常处理链。
💻 四、本地运行演练体验
1️⃣ 安装依赖
pip install flask requests
2️⃣ 设置环境变量
export FLEET_CLIENT_ID="..."
export FLEET_CLIENT_SECRET="..."
export FLEET_REDIRECT_URI="https://your-domain/callback"
3️⃣ 启动程序
python tesla_auth.py
4️⃣ 访问测试
http://localhost:5007/login?type=fleet
http://localhost:5007/login?type=owner
📌 五、总结
本篇主要完成:
- 理解 Fleet / Owner API 场景差异
- 掌握 Tesla OAuth2 + PKCE 授权流程
- 基于 Flask 的安全实现
评论区