使用 requests 模拟用户单点登录的方法

每周开周会的时候,总是因为抢不到会议室使得下班太晚吃不上饭。

遂从上个月就产生了一个写一个会议室预定的小脚本。

会议室预订系统是公司的一个子系统,公司的各个子系统是通过sso的方式进行登录的,一开始为了偷懒,想用 selenium+phantomjs 随便写一下。

可是实际操作了才发现…

废话说太多了


代码也不可能往上放,放上来了也没用

还是说一说思路吧


其实思路很简单

在浏览器中使用 firebug 看整个流程的发包~然后用代码完整模拟整个过程

就这样,该302重定向get请求啥的,模仿着请求一下就好了


参考资料:

requests 如何实现爬虫的单点登陆
https://www.v2ex.com/t/396626


单点登录(Single Sign-On, SSO)是一种用户只需登录一次,就能够访问多个应用系统的登录机制。实现单点登录的方式有很多,其中比较常见的是基于OAuth2.0协议的实现方式。下面是基于OAuth2.0协议的单点登录代码示例: 1. 授权服务器代码示例 ```python from flask import Flask, jsonify, request app = Flask(__name__) # 模拟用户信息数据库 users = { 'user1': {'id': 1, 'name': 'user1', 'pwd': 'pwd1'}, 'user2': {'id': 2, 'name': 'user2', 'pwd': 'pwd2'} } # 模拟客户端信息数据库 clients = { 'client1': {'id': 'client1', 'secret': 'secret1'} } # 模拟授权码数据库 auth_codes = {} # 模拟访问令牌数据库 access_tokens = {} # 模拟刷新令牌数据库 refresh_tokens = {} # 授权服务器处理授权请求 @app.route('/oauth2/authorize', methods=['GET']) def authorize(): # 获取客户端信息 client_id = request.args.get('client_id') client_secret = request.args.get('client_secret') redirect_uri = request.args.get('redirect_uri') response_type = request.args.get('response_type') # 验证客户端信息 if client_id not in clients or clients[client_id]['secret'] != client_secret: return jsonify({'error': 'invalid_client'}) # 显示授权页面 user_id = request.args.get('user_id') user = users[user_id] return jsonify({'user': user, 'client_id': client_id, 'redirect_uri': redirect_uri, 'response_type': response_type}) # 授权服务器处理授权码请求 @app.route('/oauth2/token', methods=['POST']) def token(): # 获取客户端信息 client_id = request.form.get('client_id') client_secret = request.form.get('client_secret') redirect_uri = request.form.get('redirect_uri') grant_type = request.form.get('grant_type') # 验证客户端信息 if client_id not in clients or clients[client_id]['secret'] != client_secret: return jsonify({'error': 'invalid_client'}) # 获取授权码 code = request.form.get('code') # 验证授权码 if code not in auth_codes or auth_codes[code]['client_id'] != client_id or auth_codes[code]['redirect_uri'] != redirect_uri: return jsonify({'error': 'invalid_grant'}) # 生成访问令牌和刷新令牌 access_token = 'access_token_{}'.format(code) refresh_token = 'refresh_token_{}'.format(code) # 存储访问令牌和刷新令牌 access_tokens[access_token] = auth_codes[code]['user_id'] refresh_tokens[refresh_token] = auth_codes[code]['user_id'] # 返回令牌信息 return jsonify({'access_token': access_token, 'refresh_token': refresh_token}) # 授权服务器处理令牌刷新请求 @app.route('/oauth2/refresh', methods=['POST']) def refresh(): # 获取客户端信息 client_id = request.form.get('client_id') client_secret = request.form.get('client_secret') grant_type = request.form.get('grant_type') # 验证客户端信息 if client_id not in clients or clients[client_id]['secret'] != client_secret: return jsonify({'error': 'invalid_client'}) # 获取刷新令牌 refresh_token = request.form.get('refresh_token') # 验证刷新令牌 if refresh_token not in refresh_tokens: return jsonify({'error': 'invalid_grant'}) # 生成访问令牌 access_token = 'access_token_{}'.format(refresh_token) # 存储访问令牌 access_tokens[access_token] = refresh_tokens[refresh_token] # 返回令牌信息 return jsonify({'access_token': access_token}) if __name__ == '__main__': app.run() ``` 2. 客户端代码示例 ```python import requests # 模拟客户端信息 client_id = 'client1' client_secret = 'secret1' # 模拟授权请求 authorize_url = 'http://localhost:5000/oauth2/authorize' params = { 'client_id': client_id, 'client_secret': client_secret, 'redirect_uri': 'http://localhost:8000/callback', 'response_type': 'code', 'user_id': 'user1' } resp = requests.get(authorize_url, params=params) print(resp.json()) # 模拟授权码请求 token_url = 'http://localhost:5000/oauth2/token' data = { 'client_id': client_id, 'client_secret': client_secret, 'redirect_uri': 'http://localhost:8000/callback', 'grant_type': 'authorization_code', 'code': 'code1' } resp = requests.post(token_url, data=data) print(resp.json()) # 模拟令牌刷新请求 refresh_url = 'http://localhost:5000/oauth2/refresh' data = { 'client_id': client_id, 'client_secret': client_secret, 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token_1' } resp = requests.post(refresh_url, data=data) print(resp.json()) ``` 需要注意的是,以上代码示例仅为演示OAuth2.0协议下的单点登录实现方式,具体实现方式需要根据实际需求进行调整。同时,需要注意保护用户隐私和安全,例如使用SSL协议对通信进行加密,避免令牌泄漏等安全问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值