CAS5.3-Restful方式认证 | 字痕随行

这篇应该是CAS系列的最后一篇了,就这么晃荡晃荡,就快过年了。

CAS高版本都支持使用Restful方式进行认证,主要是通过其开放的3个接口实现的。

第一个,获取TGT。

TGT,可以理解为一个存活时间稍长的身份凭证,这个凭证有两个有效期配置:

# Set to a negative value to never expire tickets
# cas.ticket.tgt.maxTimeToLiveInSeconds=28800
# cas.ticket.tgt.timeToKillInSeconds=7200

很多文章都说,如果7200秒没有移动过鼠标,这个凭证就会过期。

但是,一个B/S系统,这Server端是怎么监控Client端的?

所以,我觉得,可能是如果7200秒内没有任何请求就会过期。

28800是最大存续时间,意思就是不管如何,这个时间之后,TGT就会失效。

获取TGT的代码如下:

public String getTgt(String loginName, String loginPwd) {
    String tgtUrl = "https://ip:port/cas/v1/tickets";
    //使用hutool实现
    HttpResponse httpResponse = HttpRequest
            .post(tgtUrl)
            .contentType("application/x-www-form-urlencoded;charset=UTF-8")
            .header(Header.ACCEPT, "application/json;charset=UTF-8")
            .form(new HashMap<String, Object>() {
                private static final long serialVersionUID = -138163390499485640L;

                {
                    put("username", loginName);
                    put("password", loginPwd);
                }
            })
            .execute();
    return httpResponse.body();
}

第二个,获取GT。

GT,使用TGT换取的一次性票据,它和Service是绑定的。

所谓的Service其实就是需要验证的完整Url,比如上一篇的/sso/test。

默认配置下,GT获取以后,需要在10秒内进行认证,并且只能使用一次。

获取GT的代码如下:

public String getGt(String tgt, String service) {
    String stUrl = "https://ip:port/cas/v1/tickets/" + tgt;
    HttpResponse httpResponse = HttpRequest
            .post(stUrl)
            .contentType("application/x-www-form-urlencoded;charset=UTF-8")
            .header(Header.ACCEPT, "application/json;charset=UTF-8")
            .form(new HashMap<String, Object>() {
                private static final long serialVersionUID = -6472219360813373597L;

                {
                    put("service", service);
                }
            })
            .execute();
    return httpResponse.body();
}

第三个,验证GT。

获取GT之后,就可以在目标系统上进行验证了,通过验证之后,就可以获得用户的身份信息了。

代码如下:

public String getValidate(String ticket, String service) {
    String validateUrl = "https://ip:port/cas/p3/serviceValidate";
    HttpResponse httpResponse = HttpRequest
            .get(validateUrl)
            .form(new HashMap<String, Object>() {
                private static final long serialVersionUID = -7333706958754801580L;

                {
                    put("service", service);
                    put("ticket", ticket);
                }
            })
            .header(Header.ACCEPT, "application/json;charset=UTF-8")
            .execute();
    return httpResponse.body();
}

该接口返回的cas:user中的内容,就是登录账号。

如果目标系统已经按照上一篇完成了CAS的配置,其实可以直接在拦截的Url后面加上ticket参数,比如:

http://localhost/sso/test?ticket=获得的gt

如果Url和GT匹配,会自动通过验证的,有兴趣的同学可以自行尝试。

好了,以上,如果有错误,欢迎指正。

image

觉的不错?可以关注我的公众号↑↑↑