讀古今文學網 > OpenStack系統架構設計實戰 > 11.2.3 用戶認證和令牌獲取 >

11.2.3 用戶認證和令牌獲取

用戶的認證主要由兩種方式,一種是用戶名密碼方式認證,另一種是基於令牌的認證。

用戶名密碼方式認證就是本地認證,這類用戶的信息保存在Keystone數據庫中,其核心操作是通過後端動器去做密碼的校驗,就是對傳入的明文做一次SHA512的Hash操作,再與數據庫中存放的散列之後的密碼進行比對。

基於令牌的認證是當用戶請求認證時,其令牌信息包含在請求消息中,Keystone會剝離HTTP請求Header中的令牌信息,進行Hash計算並與數據庫中保存的令牌值進行比對,以確認是否有效。令牌在請求中的作用相當於用戶名和密碼。

目前V3-API還在發展過程中,而V1-API已經成熟,並且OpenStack中其他項目默認調用的仍然是V1-API,這裡重點以V1-API的請求為基礎,介紹Keystone的用戶認證及令牌獲取的工作流程。

下面以POST/v2.0/tokens為例來介紹Keystone在用戶認證以及令牌獲取的工作流程。

用戶首先發起一個有效的curl請求,請求對用戶的賬號進行驗證,並生成一個與租戶進行綁定的令牌。

$ curl -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "*", "password": "*"}}}' -H"Content –type: application/json" http://$IP:35357/v2.0/tokens | python - mjson.toolKeystone調用authenticate方法對用戶信息進行認證。Class Auth(controller.V2Controller): def authenticate(self, context, auth=None):

其中第三個參數auth就是curl請求中的傳入參數,及此租戶下用戶名及密碼。authenticate()針對不同的認證方式分別進行處理。

Keystone完成用戶的認證之後,authenticate()會檢查該用戶、租戶、域是否可用,過濾不需要返回給用戶的數據,並調用Catalog API構造服務目錄,最後通過後端生成令牌。令牌的生成有3種方式,默認使用UUID的方式。

1)UUID:調用Python庫函數生產一個隨機的UUID(通用唯一識別碼)作為令牌的ID。

2)PKIZ:使用OpenSSL對用戶相關信息進行簽名,簽名後的格式為DER,並以此生產令牌ID。

3)PKI:使用OpenSSL對用戶相關信息進行簽名,與PKIZ不同的是生成的簽名格式為PEM。

Keystone用戶認證的流程如圖11-2所示。

圖11-2 Keystone用戶認證流程