CAS單點登錄(十)——通過Restful協議請求認證和退出

前面我們講解了一些列的CAS文章,對CAS有了很多瞭解。今天我們講解一個現在服務常用的REST協議來完成CAS的登錄、認證,不需要我們手動登錄跳轉到CAS的登錄頁面就可以完成CAS的一些列操作。

我們知道CAS認證支持包括多種協議去認證,包括CAS、OAuth、SAML1、SAML2、REST Protocol等協議,這裏我們採用REST協議去獲取TGT,然後獲取到TGT後獲取到ST,最後拿到ST後再去訪問服務。

rest

一、認證服務

首先我們加入Rest服務依賴:

<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-rest-tokens</artifactId>
    <version>${cas.version}</version>
</dependency>

開啓Rest認證方式,我們在前面的文章介也紹過CAS單點登錄(三)——多種認證方式

在application.properties中,我們配置restful的鏈接。

##
# Rest配置
#
cas.authn.rest.uri=http://localhost:8088/login
cas.authn.rest.name=

rest protocol

這裏需要注意,這個是自定義Rest認證配置的相關參數,與這裏是通過公開方法RESTful來獲取票證授予票證然後使用它來獲取服務票證來實現的是不一樣的。

所以這裏我們可以不用配置Rest認證配置的參數,這裏提出來爲了區分一下區別。

注意:這裏通過REST協議去獲取TGT,暫時支持用戶名和密碼,我們在前面demo應用中加入了驗證碼的,因此繼續使用該demo時,需要在CustomAuthenticationConfiguration配置中啓用CustomUsernamePasswordAuthentication來實現認證。如下:

/**
 * @author anumbrella
 */
@Configuration("customAuthenticationConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class CustomAuthenticationConfiguration implements AuthenticationEventExecutionPlanConfigurer {

    @Autowired
    private CasConfigurationProperties casProperties;

    @Autowired
    @Qualifier("servicesManager")
    private ServicesManager servicesManager;

    @Bean
    public AuthenticationHandler myAuthenticationHandler() {
        // 參數: name, servicesManager, principalFactory, order
        // 定義爲優先使用它進行認證
        return new CustomUsernamePasswordAuthentication(CustomUsernamePasswordAuthentication.class.getName(),
                servicesManager, new DefaultPrincipalFactory(), 1);

//        return new CustomerHandlerAuthentication(CustomerHandlerAuthentication.class.getName(),
//                servicesManager, new DefaultPrincipalFactory(), 1);
    }

    @Override
    public void configureAuthenticationExecutionPlan(final AuthenticationEventExecutionPlan plan) {
        plan.registerAuthenticationHandler(myAuthenticationHandler());
    }
}

其他操作呢?沒了,就是如此簡單,啓動服務,接下來就是Restful操作。

1、獲取TGT票據

官方文檔給的操作如下:

POST /cas/v1/tickets HTTP/1.0
'Content-type': 'Application/x-www-form-urlencoded'
username=battags&password=password&additionalParam1=paramvalue

除了用戶名和密碼外,當然還可以傳遞其他參數,這裏我們原有驗證碼的,也可以通過該方式傳遞進去。

這裏我們使用POSTMAN來模擬一下:

01

這裏的service參數就是其他參數,不是必填的。是一個可選的參數,因此不用必須傳過去,如果像我們之前像服務認證有驗證碼一樣,可以自己實現通過這裏傳遞過去。

2、用TGT申請ST票據

我們在上面獲取到TGT後,然後通過https://sso.anumbrella.net:8443/cas/v1/tickets/TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac,就是上面獲取的路徑去獲取ST票據。

POST /cas/v1/tickets/{TGT id} HTTP/1.0

service={form encoded parameter for the service url}

這裏有一個參數,service就是客戶端地址,爲POST請求。

如下:
rest3

我們拿到ST = ST-5-0bAcjZ92h6QjLYx7WJ8MFtenXakanumbrelladeiMac後,再通過它去訪問具體服務。

3、通過ST票據去訪問服務

CAS默認的ST過期策略是使用一次或者超過10秒,這個對咱們做測試來說有點短所以在application.properties中更改如下。

##
# Ticket過期設置
#
cas.ticket.st.numberOfUses=1
cas.ticket.st.timeToKillInSeconds=60

使用瀏覽器訪問https://client.anumbrella.net:9443/?ticket=ST-5-0bAcjZ92h6QjLYx7WJ8MFtenXakanumbrelladeiMac路徑,可以發現不用登錄直接進入應用。

example

二、票據驗證以及銷燬

1、驗證

官方提供restful接口來驗證票據,這裏是通過cas協議來驗證,路徑爲/p3/serviceValidate,具體詳情,如下。

GET /cas/p3/serviceValidate?service={service url}&ticket={service ticket}

因爲票據是一次性使用的,所以我們再申請一個ticket,並進行驗證。

如下,可以看到具體驗證的信息。
驗證票據

除了票據的驗證,還有TGT的有效性驗證。

GET /cas/v1/tickets/TGT-fdsjfsdfjkalfewrihfdhfaie HTTP/1.0

比如TGT爲:TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac
訪問路徑https://sso.anumbrella.net:8443/cas/v1/tickets/TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac來進行驗證

票據驗證2

2、退出

在CAS中還提供了銷燬TGT的請求,發起一個DELETE請求即可。

DELETE /cas/v1/tickets/TGT-fdsjfsdfjkalfewrihfdhfaie HTTP/1.0

比如,剛纔的票據TGT-2-CbkNRl2u4WS3-WVbtGhJCYBoxbVwzC2SPEj9DEAN5Gbd2f4YWaBkJrFTdBcivytGGcoanumbrelladeiMac,我們想退出使它無效,發起一個DELETE請求即可。

然後我們再去驗證,可以發現TGT無效,不在了,刷新剛纔登錄的應用,也會自動退出。

TGT

代碼實例:Chapter9

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章