延伸 MySQL 8.4  /  ...  /  編寫客戶端身分驗證外掛程式

4.4.9.2 編寫客戶端身分驗證外掛程式

使用 mysql_declare_client_plugin()mysql_end_client_plugin 巨集宣告客戶端外掛程式描述符(請參閱第 4.4.2.3 節,「客戶端外掛程式描述符」)。對於 auth_simple 外掛程式,描述符如下所示

mysql_declare_client_plugin(AUTHENTICATION)
  "auth_simple",                        /* plugin name */
  "Author Name",                        /* author */
  "Any-password authentication plugin", /* description */
  {1,0,0},                              /* version = 1.0.0 */
  "GPL",                                /* license type */
  NULL,                                 /* for internal use */
  NULL,                                 /* no init function */
  NULL,                                 /* no deinit function */
  NULL,                                 /* no option-handling function */
  auth_simple_client                    /* main function */
mysql_end_client_plugin;

從外掛程式名稱到選項處理函數的描述符成員對於所有客戶端外掛程式類型都是通用的。(有關說明,請參閱第 4.4.2.3 節,「客戶端外掛程式描述符」。)在通用成員之後,描述符還有一個特定於身分驗證外掛程式的附加成員。這是 main 函數,它處理與伺服器的通訊。該函數採用兩個參數,分別代表 I/O 結構和連線處理常式。對於我們簡單的任何密碼外掛程式,main 函數除了將使用者提供的密碼寫入伺服器之外,不做任何其他事情

static int auth_simple_client (MYSQL_PLUGIN_VIO *vio, MYSQL *mysql)
{
  int res;

  /* send password as null-terminated string as cleartext */
  res= vio->write_packet(vio, (const unsigned char *) mysql->passwd,
                         strlen(mysql->passwd) + 1);

  return res ? CR_ERROR : CR_OK;
}

main 函數應傳回下表中顯示的其中一個錯誤碼。

錯誤碼 含義
CR_OK 成功
CR_OK_HANDSHAKE_COMPLETE 成功,客戶端完成
CR_ERROR 錯誤

CR_OK_HANDSHAKE_COMPLETE 表示客戶端已成功完成其部分,並且已讀取最後一個封包。如果身分驗證協定中的往返次數不是事先已知的,並且外掛程式必須讀取另一個封包才能判斷是否完成身分驗證,則客戶端外掛程式可能會傳回 CR_OK_HANDSHAKE_COMPLETE