网上有关于JAVA、PHP、.Net的CAS单点登录客户端的实现方式,用C++客户端实现的例子少之又少。下面针对这方面的稀缺,整理了一份实现流程。
开发平台:VS2008
开发语言:C++
外部包引用:curl-7.29.0、openssl-1.0.1e
CAS服务版本:3.5.1
在curl工程设置的预处理中添加USE_SSLEAY与USE_OPENSSL两个宏与libeay32.lib ssleay32.lib两个库文件,让curl支持openssl,需要重新编译链接。
在进行CAS登录及验证的过程中最重要的几个数据是:TGT、JSESSIONID
TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
一、通过GET方式后台获取JSESSION、LT与execution
从返回的Response(CAS的登录页面)中提取JSESSIONID、LT与execution信息。
二、通过POST的方式进行登录请求,并获取TGT
登录成功后从返回的Response中提取TGT信息,在HEADER中的字段名为CASTGC。
三、用户身份验证
在进行用户身份验证时需要用的信息如下
JSESSIONID=F5D3585514062FDB074B4A5D097ED1C1;
CASTGC=TGT-42-09K6HQRjMHgdYtsBeONUAIpRzfsEYd6ROST6j3CuB5f7x0rVbO-cas01.example.org
如果需要让一个新打开的WEB页面能进行用户身份验证,则必须通过InternetSetCookie方法将以上信息保存到Cookie中传到页面中。
https://{CAS域名}/login?service=http://{URL}
开发平台:VS2008
开发语言:C++
外部包引用:curl-7.29.0、openssl-1.0.1e
CAS服务版本:3.5.1
在curl工程设置的预处理中添加USE_SSLEAY与USE_OPENSSL两个宏与libeay32.lib ssleay32.lib两个库文件,让curl支持openssl,需要重新编译链接。
在进行CAS登录及验证的过程中最重要的几个数据是:TGT、JSESSIONID
TGT(Ticket Grangting Ticket)
TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
一、通过GET方式后台获取JSESSION、LT与execution
//获取Response数据回调
size_t URL_writefunc(void *ptr, size_t size, size_t nmemb, struct mystring *s)
{
size_t new_len = s->len + size*nmemb;
s->ptr = realloc(s->ptr, new_len+1);
if (s->ptr == NULL)
return -1;
memcpy(s->ptr+s->len, ptr, size*nmemb);
s->ptr[new_len] = '\0';
s->len = new_len;
return size*nmemb;
}
//在进行Request时所需要的一些参数
curl_easy_setopt(u->curl, CURLOPT_URL, url); //CAS服务登录地址 https://{CAS域名}/login
curl_easy_setopt(u->curl, CURLOPT_WRITEFUNCTION, URL_writefunc); //获取Response数据回调
curl_easy_setopt(u->curl, CURLOPT_WRITEDATA, out); //Response数据存储字符串
curl_easy_setopt(u->curl, CURLOPT_FOLLOWLOCATION, TRUE); //捕获重定向URL的信息
curl_easy_setopt(u->curl, CURLOPT_SSL_VERIFYPEER, FALSE); //如果数字证书不完整时可设置为FALSE,不进行验证
curl_easy_setopt(u->curl, CURLOPT_HEADER, TRUE); //Response数据中包含HEADER信息,为了更方便的获取JSESSIONID信息
//发送登录Request
u->res = curl_easy_perform(u->curl);
从返回的Response(CAS的登录页面)中提取JSESSIONID、LT与execution信息。
二、通过POST的方式进行登录请求,并获取TGT
//后台登录所需参数
postfield="username=a&password=a<=LT-110-DLro3EN3p5BuHslQAAk6helHAU2bmP&execution=e1s1&_eventId=submit&submit=login"
//Cookie信息
cookie="JSESSIONID=F5D3585514062FDB074B4A5D097ED1C1"
curl_easy_setopt(c->u.curl, CURLOPT_POSTFIELDS, postfield); //设置POST参数,在网上找到用CURLOPT_HTTPPOST方式传参的例子,可惜在测试过程中服务端会报login map{empty}的错误。
curl_easy_setopt(c->u.curl, CURLOPT_COOKIE, cookie); //在进行后台登录时cookie信息是非常重要,不然无法成功
curl_easy_setopt(c->u.curl, CURLOPT_HEADER, TRUE); //Response数据中包含HEADER信息,为了更方便的获取TGT信息
curl_easy_setopt(u->curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_easy_setopt(u->curl, CURLOPT_WRITEFUNCTION, URL_writefunc);
curl_easy_setopt(u->curl, CURLOPT_WRITEDATA, out);
curl_easy_setopt(u->curl, CURLOPT_SSL_VERIFYPEER, FALSE);
u->res = curl_easy_perform(u->curl);
登录成功后从返回的Response中提取TGT信息,在HEADER中的字段名为CASTGC。
三、用户身份验证
在进行用户身份验证时需要用的信息如下
JSESSIONID=F5D3585514062FDB074B4A5D097ED1C1;
CASTGC=TGT-42-09K6HQRjMHgdYtsBeONUAIpRzfsEYd6ROST6j3CuB5f7x0rVbO-cas01.example.org
如果需要让一个新打开的WEB页面能进行用户身份验证,则必须通过InternetSetCookie方法将以上信息保存到Cookie中传到页面中。
https://{CAS域名}/login?service=http://{URL}