翻譯 pjsip開發者指南(九)認證框架

2021-09-25 11:20:14 字數 4491 閱讀 4141

chapter 9:authentication framework

pjsip提供客戶端和伺服器的認證框架。認證框架支援預設的http摘要認證,但是其他的認證方案也可以加到框架中。

下面的圖表描述了框架的類圖。

客戶端身份驗證框架管理客戶端到所下游伺服器的身份驗證過程。它能以正確的憑證來響應伺服器的認證(當有這種憑證提供),快取認證資訊,並且使用快取的認證資訊來初始化之後的請求。

9.1.1 client authentication framework reference

認證的api在標頭檔案 中宣告。下面是認證的資料結構和函式的文件引用。

pjsip_cred_info

這個結構描述了特定範圍內的認證。乙個客戶端在乙個對話或者註冊期間有多個認證。每一種憑證都包含針對下游**或伺服器的認證資訊。

比如,客戶端需要乙個憑證來驗證的外發**伺服器,或者其他的憑證來驗證端伺服器。

pjsip_cached_auth

這個結構體儲存特定伺服器的最終鑑權。這個是必須的因為這樣客戶端可以用最後的鑑權來初始化下一次的請求。

pjsip_auth_clt_sess

這個結構體描述了客戶端認證會話。客戶端在對話或者註冊期間通常會儲存這個結構體。

function referencepj_status_t pjsip_auth_clt_init( pjsip_auth_clt_sess *sess,

pj_pool_t *pool, unsigned options);

初始化認證會話的資料結構,並設定會話使用pool來進行後續的記憶體分配。引數選項這個版本可以設定為0。

pj_status_t pjsip_auth_clt_set_credentials( pjsip_auth_clt_sess *s,

int cred_cnt,

const pjsip_cred_info cred);

設定會話期間的憑證。使用客戶端的認證池來賦值指定的憑證。

pj_status_t pjsip_auth_clt_init_req( pjsip_auth_clt_sess *sess,

pjsip_tx_data *tdata );

這個函式根據會話快取的資訊為新的傳送請求tdata增加所有的認證頭。這個請求訊息的請求行在呼叫這個函式前必須是有效的。

pj_status_t pjsip_auth_clt_reinit_req( pjsip_auth_clt_session *sess,

pjsip_endpoint *endpt,

const pjsip_rx_data *rdata,

pjsip_tx_data *old_request,

pjsip_tx_data **new_request )

呼叫這個函式在收到失敗的認證狀態(401.407)後重新初始化請求。這個函式根據 old_request重新建立 new_request,根據rdata響應中的鑑權新增合適的認證和**認證頭。除此之外,這個函式還會在會話中新增相關資訊。

如果鑑權缺少證書,這個函式會返回失敗。注意這個函式可以重用舊的請求而不是再建立乙個新的。

9.1.2 examples

client transaction authentication

下面的例子說明了如何用認證資訊初始化發出的請求以及處理來自伺服器的鑑權。為了簡單說明,例子裡沒有展示錯誤處理。乙個好的應用程式應該有準備處理任何情形下的錯誤的能力。

pjsip_auth_client_session auth_sess;

// initialize client authentication session with some credentials.

void init_auth(pj_pool_t *session_pool)

// initialize outgoing request with authorization information and

// send the request statefully.

void send_request(pjsip_tx_data *tdata)

// callback when the transaction completes.

static void on_complete( void *token, pjsip_event *event )

}

9.2 server authorization framework伺服器認證框架提供了兩種伺服器認證機制:

#無會話伺服器認證為認證的客戶端提供了通用api。 這個api在每個請求的基礎上提供了全域性的伺服器認證,通常用於**認證伺服器當它呼叫不是有狀態時。

#伺服器認證會話,提供了特定對話或者註冊會話中的全域性伺服器認證機制。需要為伺服器的對話或者註冊會話建立伺服器認證會話的例項。乙個伺服器認證會話要有乙個初始設定的憑證,這個憑證在對話/註冊會話期間一直被客戶端使用。

9.2.1 server authorization reference

data types reference

typedef pj_status_t pjsip_auth_lookup_cred( pj_pool_t *pool,

const pj_str_t *realm,

const pj_str_t *acc_name,

pjsip_cred_info *cred_info );

在指定的realm中查詢acc_name的憑證資訊的要註冊到認證伺服器的型別。當成功查詢到憑證資訊,函式用憑證填充cred_info並返回pj_success。否則就返回以下的 錯誤碼:

# pjsip_eauthaccnotfound :在指定的realm中未找到賬號

# pjsip_eauthaccdisabled:賬號找到了但是不可用

functions reference

pj_status_t pjsip_auth_srv_init( pj_pool_t *pool,

pjsip_auth_srv *auth_srv,

const pj_str_t *realm,

pjsip_auth_lookup_cred *lookup_func,

unsigned options );

初始化伺服器認證會話資料結構以服務於指定的realm,並使用lookup_func函式查詢憑證資訊options引數是下面值的位掩碼組合:

# pjsip_auth_srv_is_proxy:指明伺服器認證客戶端為乙個**伺服器(而不是作為uas),也就是說使用 proxy-authenticate代替 www-authenticate。

pj_status_t pjsip_auth_srv_verify( pjsip_auth_srv *auth_srv,

pjsip_rx_data *rdata,

int *status_code );

請求認證服務區驗證rdata請求中的認證資訊。如果status_code不是null,將適當的填充響應狀態(401/407等)。

如果請求中的認證資訊可被接受,函式將返回pj_success,或者當認證失敗的時候,返回下面的錯誤:

# pjsip_eauthnoauth:請求中未指明認證頭

# pjsip_einvalidauthscheme:無效或不支援的認證方案(當前只支援摘要)

# pjsip_eauthaccnotfound or pjsip_eauthaccdisabled:查詢函式返回的錯誤碼

# pjsip_eauthinvaliddigest:無效的摘要

#其他表示系統錯誤的非零值

pj_status_t pjsip_auth_srv_challenge( pjsip_auth_srv *auth_srv,

const pj_str_t *qop,

const pj_str_t *nonce,

const pj_str_t *opaque,

pj_bool_t stale,

pjsip_tx_data *tdata);

在發出的響應tdata中增加認證質詢頭。如果指定了qop,將該值放到質詢中,應用也可以指定nonce和qpaque,或者可以讓這些值為null,以隨機字母填充。

9.3 extending authentication framework

認證框架可以擴充來支援非http摘要的認證框架 (pgp)

todo。

翻譯 pjsip開發者指南(十一)SDP協商框架

chapter 11 sdp offer answer framework sdp offer answer 框架是基於 rfc 3264 an offer answer model with the session descriptor protocol sdp 主要的作用是加速本地和遠端的 協商...

PJSIP開發手冊之認證框架(九)

第九章 認證框架 pjsip的認證框架支援客戶端和服務端的認證。這個認證框架預設支援http摘要認證,但是其他認證機制也可以加入這個框架。下圖說明了該框架的 類圖 客戶端認證框架 客戶端認證框架管理從客戶端到所有下流的伺服器的認證處理。它可以使用正確的證書 當這樣的證書被提供 響應伺服器的挑戰,快取...

Mark NG 全球開發者大會志願翻譯

2020 11 07 我認領的是演講 ai ml如何加速小分子藥物發現 的英文校驗任務。演講的分享者黃毅汪,是法國亞創生命科學部門team leader,也是演算法工程師。因為涉及機器學習和深度學習領域的術語,在加入的時候大家填過自己的英語水平和專業背景簡介,可能比較合適吧,所以就領到了這個英文校驗...