You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现类似Postman的OAuth2隐式模式生成访问令牌

用Python实现OAuth 2.0隐式授权获取访问令牌

一、现成解决方案:使用requests-oauthlib库

requests-oauthlib是Python生态中处理OAuth 2.0认证的成熟工具,已经封装了隐式授权的完整流程,无需手动处理跳转和令牌解析逻辑。

安装依赖

pip install requests-oauthlib

代码示例

from requests_oauthlib import OAuth2Session

# 替换为你的实际配置参数
client_id = "your_client_id"
auth_url = "https://your-auth-server.com/oauth/authorize"
redirect_uri = "https://your-callback-url.com"
scope = ["read", "write"]  # 根据实际需求调整作用域

# 初始化OAuth2会话
oauth_session = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)

# 生成授权URL,同时返回用于防CSRF的state参数
authorization_url, _ = oauth_session.authorization_url(auth_url)

print(f"请在浏览器中打开以下链接完成授权: {authorization_url}")
print("授权成功后,将浏览器地址栏中的完整回调URL复制粘贴到下方:")

# 用户输入授权后的回调URL
redirect_response = input("回调URL: ")

# 从回调URL的fragment部分提取访问令牌
token = oauth_session.token_from_fragment(redirect_response)

print(f"成功获取访问令牌: {token['access_token']}")

说明

这段代码会生成包含所有必要参数的授权链接,用户完成授权后,浏览器会跳转到你配置的回调URL,URL的#(fragment)部分会携带access_token。代码通过token_from_fragment方法自动解析出令牌。


二、手动实现隐式授权流程(适合理解底层逻辑)

如果不想依赖第三方库,可以手动处理授权流程,这里用Flask搭建一个临时本地服务来接收回调并提取令牌:

安装依赖(若未安装Flask)

pip install flask

代码示例

from flask import Flask, request
import webbrowser
import time

app = Flask(__name__)
access_token = None  # 全局变量存储令牌

# 替换为你的实际配置参数
client_id = "your_client_id"
auth_url = "https://your-auth-server.com/oauth/authorize"
redirect_uri = "http://localhost:5000/callback"
scope = "read write"  # 多个作用域用空格分隔

@app.route('/callback')
def callback():
    # 前端脚本提取URL fragment中的令牌并发送到后端
    return '''
    <script>
        const params = new URLSearchParams(window.location.hash.slice(1));
        const tokenData = { access_token: params.get('access_token') };
        fetch('/save_token', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(tokenData)
        }).then(() => window.close());
    </script>
    '''

@app.route('/save_token', methods=['POST'])
def save_token():
    global access_token
    data = request.get_json()
    access_token = data.get('access_token')
    return "令牌已保存"

if __name__ == '__main__':
    # 构造完整的授权请求URL
    auth_request_url = (
        f"{auth_url}?response_type=token"
        f"&client_id={client_id}"
        f"&redirect_uri={redirect_uri}"
        f"&scope={scope}"
    )
    
    # 自动打开浏览器访问授权链接
    webbrowser.open(auth_request_url)
    
    # 启动本地Flask服务
    app.run(port=5000, threaded=True)
    
    # 等待令牌获取完成
    while access_token is None:
        time.sleep(1)
    
    print(f"成功获取访问令牌: {access_token}")

说明

这段代码启动一个本地服务,自动打开授权链接让用户完成认证。授权成功后,浏览器跳转到本地回调地址,通过前端脚本提取URL fragment中的令牌并发送到后端,最终打印出获取到的access_token。

内容的提问来源于stack exchange,提问作者Ben 8D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:10:30