利用Pythonrequests库实现cas认证

利用Pythonrequests库实现cas认证

2023年6月27日发(作者:)

利⽤Pythonrequests库实现cas认证1.准备⼯作-背景知识1.1 requests库简介:python有很多可以⽤来测试接⼝的模块,个⼈觉得,requests库是最好⽤的, 在Robot Framwork⾥,它的测试库requestsLibrary,也是基于requests写的。1.1.1 安装:作为第三⽅模块,使⽤前,需要安装,最简单的安装⽅式如下pip install requests1.1.2 语法(简明版):1)如何发送请求 :发送get请求:(url, params, headers, cookies, verify, )发送post请求: (url, params, data, headers, cookies, verify, )*****以上只有url参数是必填的,其他可以根据需要选填*****除了get和post,还⽀持其他http请求,⽐如delete等等,不过在我们的cas认证中,只需要get和post;⽽且⼀般的接⼝测试中,最常⽤的也就是get和post消息2)如何得到响应:假设发送了⼀个请求:r=(url, params, headers, cookies, verify, )那么以下是返回结果:s 返回的头信息 返回的主体_code 返回的状态码1.1.3 基于requests库,重写get和post请求为了让requests库更能符合我们的需求,进⾏了简单的封装,重写了get和post请求发送:设置了常⽤的headers参数sesssion_id作为参数传⼊对于post消息,会根据data值,设置Content-Length#encoding=utf-8import requestsclass RestfulTest(object): @staticmethod def send_get_request(url, params= None, session_id= None, verify = False , allow_redirects= False): #disable warnings e_warnings() if params == None: params = {} if session_id == None: cookies = {} else: cookies = {'JSESSIONID':session_id} headers = {

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0",

} get_response = (url, params=params, headers=headers, cookies=cookies, verify=verify, allow_redirects=allow_redirects) return get_response @staticmethod def send_post_request(url, params= None, data= None, session_id= None, verify= False, allow_redirects=False): #disable warnings e_warnings() if params == None: params = {} if data == None: data = {} if session_id == None: cookies = {} else: cookies = {'JSESSIONID':session_id} headers = {

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Connection": "keep-alive", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Content-Length": str(len(data)) } post_response = (url, params=params, data=data, headers=headers, cookies=cookies, verify=verify, allow_redirects=allow_redirects) return post_response1.2 cas 认证原理CAS旨在为 Web 应⽤系统提供⼀种可靠的单点登录⽅法Single Sign On,简称SSO,SSO使得在多个应⽤系统中,⽤户只需要登录⼀次就可以访问所有相互信任的应⽤系统从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独⽴部署,主要负责对⽤户的认证⼯作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server

CAS Client 与受保护的客户端应⽤部署在⼀起,以 Filter ⽅式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前⽤户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的⽬的资源地址),以便登录成功过后转回该地址⽤户在第 3 步中输⼊认证信息,如果登录成功,CAS Server 随机产⽣⼀个相当长度、唯⼀、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统⾃动重定向到 Service 所在地址,并为客户端浏览器设置⼀个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service和新产⽣的 Ticket 过后,在第 5,6 步中与 CAS Server进⾏⾝份合适,以确保 Service Ticket 的合法性在该协议中,所有与 CAS 的交互均采⽤ SSL 协议,确保ST 和 TGC 的安全性。协议⼯作过程中会有 2 次重定向的过程,但是 CAS Client与 CAS Server 之间进⾏ Ticket 验证的过程对于⽤户是透明的。总结⼀下,如下:访问服务: SSO 客户端发送请求访问应⽤系统提供的服务资源。定向认证: SSO 客户端会重定向⽤户请求到 SSO 服务器。⽤户认证:⽤户⾝份认证。发放票据: SSO 服务器会产⽣⼀个随机的 Service Ticket 。验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。传输⽤户信息: SSO 服务器验证票据通过后,传输⽤户认证结果信息给客户端。

2. python代码实现cas认证以下代码实现的是我们被测server的cas登录,不同产品,获得cookie值⽅式可能有所不同,post的data值可能也有所不同,但是⼤致原理是⼀致的

#usr/bin/env python#encoding=utf-8from restfulTest import RestfulTestfrom dataProcess import DataProcessclass LoginToServer(object):

@staticmethod def get_service_sessionId_redirectUrl(service_url): response = _get_request(service_url) cookieValue = s['set-cookie'] redirectUrl = s['location'] sessionId = _first_matching_group_by_pattern(cookieValue, 'JSESSIONID=(w+); Path')

return sessionId, redirectUrl

@staticmethod def cas_server_authentication(cas_server_url, userName="admin", userPasswd="admin"):

response1 = _get_request(cas_server_url)

cas_server_sessionId = _first_matching_group_by_pattern(s['set-cookie'], 'JSESSIONID=(w+); Path')

submitLt = _first_matching_group_by_pattern(t, 'name="lt" value="(w+)"') http_data_for_auth = "username="+userName+"&password="+userPasswd+"<="+submitLt+"&_eventId=submit&submit=Log+In"

response2 = _post_request(cas_server_url, data = http_data_for_auth, session_id = cas_server_sessionId )

acceptLt= _first_matching_group_by_pattern(t, 'name="lt" value="(w+)"') http_data_for_confirm ="_eventId_accept=Accept<="+acceptLt response3 = _post_request(cas_server_url, data = http_data_for_confirm, session_id = cas_server_sessionId ) casTicket = _first_matching_group_by_pattern(s['set-cookie'], 'CASTGC=(S+); Path=irisCAS; Secure') redirectUrl = s['location'] return cas_server_sessionId, casTicket, redirectUrl @staticmethod def redirect_to_service(service_url, service_sessionId): response = _get_request(service_url, session_id = service_sessionId, allow_redirects= True) return response @staticmethod def login_to_service(service_url, userName="admin", userPasswd="admin"): service_sessionId, redirectToCas = _service_sessionId_redirectUrl(service_url) cas_server_sessionId, casTicket, redirectToServer = _server_authentication(redirectToCas, userName, userPasswd) response = ct_to_service(redirectToServer, service_sessionId) if _code == 200: print "Login To Service Success" else: print "Login To Service Fail" return service_sessionId

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687866071a52075.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信