簡體   English   中英

使用用戶名/密碼憑證在Linux上對遠程用戶進行身份驗證

[英]Authenticate remote user on linux with username/password credentials

我正在為新房子中的快門控制解決方案計划REST服務。 該服務應該在linux服務器上運行,並且由於這確實是應該可用的,因此我希望在沒有操作系統本身和很少的標准庫的情況下,不依賴任何運行時依賴項來執行該服務。 所以我更喜歡用來做。

到目前為止,我發現libasyncd應該可以給我一個不錯的HTTPS主機。 我現在關心的是如何處理身份驗證。 為了簡單起見,應該執行HTTP基本身份驗證 ,但是我想針對我的系統用戶存儲(當前為OpenLDAP目錄)進行身份驗證。 理想情況下,我希望有一個從此商店中抽象出來的解決方案。

我最初以為可能是要走的路,但是到目前為止我能找到的所有示例都讓進行密碼提示,而我需要的是一個使用用戶名和密碼並告訴我是否通過身份驗證的函數。 甚至有可能嗎? 如果是這樣,我應該在哪里尋找文檔? 如果沒有,您能提出其他選擇嗎?

繼續我的研究之后,我終於有了一些可行的示例代碼,該代碼只提供了我正在尋找的的用戶/密碼檢查功能。 我將其張貼在這里作為參考答案。

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM