如何用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
相关产品推荐
相关产品推荐

