[英]Authenticate remote user on linux with username/password credentials
我正在为新房子中的快门控制解决方案计划REST服务。 该服务应该在linux服务器上运行,并且由于这确实是应该可用的,因此我希望在没有操作系统本身和很少的标准库的情况下,不依赖任何运行时依赖项来执行该服务。 所以我更喜欢用c来做。
到目前为止,我发现libasyncd应该可以给我一个不错的HTTPS主机。 我现在关心的是如何处理身份验证。 为了简单起见,应该执行HTTP基本身份验证 ,但是我想针对我的系统用户存储(当前为OpenLDAP目录)进行身份验证。 理想情况下,我希望有一个从此商店中抽象出来的解决方案。
我最初以为pam可能是要走的路,但是到目前为止我能找到的所有示例都让pam进行密码提示,而我需要的是一个使用用户名和密码并告诉我是否通过身份验证的函数。 pam甚至有可能吗? 如果是这样,我应该在哪里寻找文档? 如果没有,您能提出其他选择吗?
继续我的研究之后,我终于有了一些可行的示例代码,该代码只提供了我正在寻找的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);
}
当然,必须在所有地方都添加错误检查以提高生产质量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.