2、API基础与认证:RESTful API设计原则、OAuth2.0授权流程、Access Token获取与刷新、签名机制
好,咱们正式开始啃这块硬骨头。API认证这块,说白了就是你和抖音服务器之间的「接头暗号」。暗号对上了,数据才能给你。我刚开始接触抖音开放平台时,就被这堆Token、签名搞得晕头转向。后来踩了几个坑,才摸清楚门道。
2.1 RESTful API设计原则
抖音的API,遵循的是RESTful风格。什么叫RESTful?我个人的理解是:用HTTP的动词,去操作资源。
- GET:获取数据。比如获取用户信息、视频列表。
- POST:创建数据。比如发布视频、创建评论。
- PUT:更新数据。比如修改用户昵称。
- DELETE:删除数据。比如删除一条评论。
举个例子,你想获取某个用户的公开信息,请求就是:
GET https://open.douyin.com/oauth/userinfo/
注意看,URL里只有名词(userinfo),没有动词。这就是RESTful的核心——用HTTP方法表达动作。我在项目中遇到过不少新手,把URL写成 /getUserInfo 或 /deleteVideo,这其实是不规范的。
/video/,用户相关是 /user/。记住这个规律,找接口会快很多。
2.2 OAuth2.0授权流程
接下来是重头戏——OAuth2.0。你想想看,抖音凭什么把用户数据给你?它得先确认两件事:你是谁?用户同意了吗?
OAuth2.0就是解决这个问题的。抖音用的是授权码模式(Authorization Code),流程大致如下:
- 你的应用引导用户跳转到抖音授权页面。
- 用户点击「同意授权」。
- 抖音回调你的服务器,带一个临时的授权码(code)。
- 你的服务器用这个code,去换Access Token。
- 拿到Access Token,你就可以调用API了。
嗯,这里要注意:授权码是一次性的,而且有效期很短(通常几分钟)。我曾经有个同事,把code存到数据库里想重复用,结果折腾了半天才发现问题。
2.3 Access Token获取与刷新
拿到Access Token只是第一步。它是有有效期的——抖音的Access Token有效期是2小时。过期了怎么办?别急,抖音还给了你一个Refresh Token,有效期是30天。
获取Access Token的请求示例:
POST https://open.douyin.com/oauth/access_token/
Content-Type: application/json
{
"client_key": "你的应用Key",
"client_secret": "你的应用Secret",
"code": "授权码",
"grant_type": "authorization_code"
}
返回的数据长这样:
{
"access_token": "access_token_xxxxx",
"expires_in": 7200,
"refresh_token": "refresh_token_xxxxx",
"refresh_expires_in": 2592000,
"open_id": "用户的唯一标识"
}
当Access Token过期时,用Refresh Token去刷新:
POST https://open.douyin.com/oauth/refresh_token/
Content-Type: application/json
{
"client_key": "你的应用Key",
"grant_type": "refresh_token",
"refresh_token": "之前拿到的refresh_token"
}
2.4 签名机制
最后说说签名。抖音为了防止请求被篡改,要求每个API请求都带上签名。说白了,就是把你请求的参数,加上一个密钥,算出一个哈希值。
签名算法步骤:
- 把所有请求参数(包括Access Token、时间戳、随机数等)按字典序排序。
- 拼接成字符串:
key1=value1&key2=value2。 - 在字符串末尾加上你的
client_secret。 - 用MD5或SHA1计算哈希值。
- 把哈希值放到请求头或参数里。
代码示例(Python):
import hashlib
import time
import random
def generate_sign(params, client_secret):
# 1. 排序
sorted_params = sorted(params.items())
# 2. 拼接
sign_str = '&'.join([f"{k}={v}" for k, v in sorted_params])
# 3. 加上密钥
sign_str += f"&client_secret={client_secret}"
# 4. 计算MD5
sign = hashlib.md5(sign_str.encode()).hexdigest()
return sign
# 使用示例
params = {
"access_token": "your_token",
"timestamp": int(time.time()),
"nonce": random.randint(100000, 999999)
}
client_secret = "your_secret"
sign = generate_sign(params, client_secret)
params["sign"] = sign
好了,API基础与认证这块,核心就是这些。记住:授权码换Token,Token要刷新,请求要签名。这三步走稳了,后面的数据接口调用就顺风顺水了。