如何在http-client中使用HTTP Basic Auth发送认证请求?
实现方案
curl -u 'user:pass' 的核心逻辑是向请求添加HTTP Basic认证凭据,下面给出两种实现方式,优先推荐符合生态惯用写法的安全实现。
推荐写法(生产环境适用)
这种写法不把凭据写入URI,避免日志、排障打印时泄露密码,是社区通用的标准写法:
(use http-client intarweb uri-common base64) ;; 构造目标请求地址 (define api-uri (uri-reference "https://api.example.net/a/b/c")) ;; 生成Basic认证头,逻辑和curl -u完全一致 (define basic-auth-header (cons 'authorization (string-append "Basic " (base64-encode (string->utf8 "user:pass"))))) ;; 发起GET请求,最后一个参数是响应处理逻辑,可按需替换 (call-with-input-request (make-request method: 'GET uri: api-uri headers: (headers (list basic-auth-header))) #f read-string)
注意:如果使用中遇到认证失败,可以检查base64编码结果是否带自动换行,部分旧版本base64库会在长字符串后插入换行符,手动剔除
\n、\r字符即可。
简化写法(仅临时测试适用)
你提到的make-uri传入用户名密码的方式确实可以生效,http-client会自动识别URI中的凭据生成对应认证头,代码更短,但因为凭据会明文存在于URI对象中,不推荐生产环境使用:
(use http-client uri-common) (call-with-input-request (make-uri scheme: 'https host: "api.example.net" path: '("a" "b" "c") username: "user" password: "pass") #f read-string)
两种写法发出的HTTP请求和给出的curl命令完全等效,服务端不会有识别差异。如果后续需要切换其他认证方式(比如Bearer Token、Digest认证),第一种写法修改成本更低。
内容的提问来源于stack exchange,提问作者shadowtalker
相关产品推荐
相关产品推荐

