我正在尝试使用 PAM 进行身份验证:
// gcc [file] -lstdc++ -lpam -lpam_misc
#include <iostream>
#include <security/pam_appl.h>
#include <security/pam_misc.h>
int main()
{
const char * username = "********";
const char * password = "********";
const char * data[] = {username, password};
struct pam_conv pconv = {misc_conv, data};
struct pam_handle *phandle = NULL;
int result;
result = pam_start("display_manager", username, &pconv, &phandle);
std::cout << "pam_start: " << pam_strerror(phandle, result) << "\n";
result = pam_authenticate(phandle, 0);
std::cout << "pam_authenticate: " << pam_strerror(phandle, result) << "\n";
}
尽管我提供了正确的密码,但它还是失败了,没有任何有用的错误消息(它只是说“身份验证失败”)。
这是我的journalctl(我用********替换了用户名和主机名):
Oct 08 19:50:26 ******** main[42928]: pam_warn(display_manager:auth): function=[pam_sm_authenticate] flags=0 service=[display_manager] terminal=[<unknown>] user=[********] ruser=[<unknown>] rhost=[<unknown>]
Oct 08 19:50:26 ******** main[42928]: PAM pam_close_session: NULL pam handle passed
Oct 08 19:50:26 ******** main[42928]: PAM pam_setcred: NULL pam handle passed
Oct 08 19:50:26 ******** main[42928]: PAM pam_end: NULL pam handle passed
您没有正确编写授权模块!密码在 pam_sm_authenticate 函数中检查,您必须在其中实现密码验证。如果正确,则返回“PAM_SUCCESS”或“PAM_AUTH_ERR”。
你的程序中不能有“main”函数。这不是一个可执行文件,而是一个模块。我建议你看看我写的模块以及它是如何编译的。 https://github.com/oditynet/2fact-telegram
例如我的项目的逻辑:
pin= converse(pamh, PAM_PROMPT_ECHO_OFF, "Please enter the PIN: ");
if (atoi(pin) == 12345)
{
return PAM_SUCCESS;
}
return PAM_AUTH_ERR ;