我正计划在新房子里为自己的快门控制解决方案提供REST服务。该服务应该在linux服务器上运行,因为这是真正应该可用的东西,我想这样做除了操作系统本身和很少的标准库之外没有任何运行时依赖性。所以我更愿意在c中进行。
到目前为止,我发现libasyncd应该会给我一个很好的HTTPS主机。我现在关注的是如何处理身份验证。为简单起见, HTTP basic auth 应该这样做,但我想对我的系统用户存储(此时是一个OpenLDAP目录)进行身份验证。理想情况下,我想要一个从这家商店抽象出来的解决方案。
我首先想到pam可能是要走的路,但到目前为止我能找到的所有示例都让pam做了密码提示,而我需要的是一个带有用户名和密码的函数。告诉我是否经过验证。这可能是pam吗?如果是这样,我应该在哪里寻找文件?如果没有,你能提出任何其他选择吗?
答案 0 :(得分:3)
继续我的研究之后,我终于有一些工作示例代码,只使用pam我正在寻找的用户/密码检查。我在这里发布它作为参考的答案。
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <security/pam_appl.h>
static int pamconv(int num_msg, const struct pam_message **msg,
struct pam_response **resp, void *appdata_ptr)
{
char *pass = malloc(strlen(appdata_ptr)+1);
strcpy(pass, appdata_ptr);
int i;
*resp = calloc(num_msg, sizeof(struct pam_response));
for (i = 0; i < num_msg; ++i)
{
/* Ignore all PAM messages except prompting for hidden input */
if (msg[i]->msg_style != PAM_PROMPT_ECHO_OFF)
continue;
/* Assume PAM is only prompting for the password as hidden input */
resp[i]->resp = pass;
}
return PAM_SUCCESS;
}
bool checkAuthentication(const char *user, const char *pass)
{
/* use own PAM conversation function just responding with the
password passed here */
struct pam_conv conv = { &pamconv, (void *)pass };
pam_handle_t *handle;
int authResult;
pam_start("shutterd", user, &conv, &handle);
authResult = pam_authenticate(handle,
PAM_SILENT|PAM_DISALLOW_NULL_AUTHTOK);
pam_end(handle, authResult);
return (authResult == PAM_SUCCESS);
}
当然,为了生产质量,必须在各地添加错误检查。