如何emacs的URL包处理认证?(How does emacs url package handl

2019-08-22 11:35发布

我还没有看到网络上的一个很好的例子。 我怎样才能像这样的请求添加验证:

(defun login-show-posts ()
  (interactive)
  (let ((url-request-method "GET")
        (url-request-extra-headers '(("Content-Type" . "application/xml"))))
    (url-retrieve "http://localhost:3000/essay/1.xml" 
    (lambda (status)
                    (switch-to-buffer (current-buffer))
                    ))))

例如如果用户和传球为admin:管理员?

Answer 1:

我得到的印象是url.el大部分是专为交互式操作,也就是你做一个呼叫未经授权,服务器(正确的代码?)的地位和403“需要授权”响应url.el将查询用户名用户和密码。

你可以看看我的代码http://github.com/hdurer/fluiddb.el ,我试图以编程方式做事情。

基本上,我创建HTTP报头authorzation自己(base64编码格式正确的字符串,并添加正确的报头以url-request-extra-headers )。 然后在第二个步骤,我需要补充的意见, url-http-handle-authentication ,这样就不会询问用户应该传递的凭据是不能接受的。

这感觉很像强奸url.el ,但它为我,是我可以使它工作的唯一途径。


因此,你的代码会是这个样子:

 (defvar xyz-user-name "admin")
 (defvar xyz-password "admin")

 (defvar xyz-block-authorisation nil 
   "Flag whether to block url.el's usual interactive authorisation procedure")

 (defadvice url-http-handle-authentication (around xyz-fix)
   (unless xyz-block-authorisation
       ad-do-it))
 (ad-activate 'url-http-handle-authentication)


 (defun login-show-posts ()
   (interactive)
   (let ((xyz-block-authorisation t)
         (url-request-method "GET")
         (url-request-extra-headers 
          `(("Content-Type" . "application/xml")
            ("Authorization" . ,(concat "Basic "
                                        (base64-encode-string
                                         (concat xyz-user-name ":" xyz-password)))))))
     (url-retrieve "http://localhost:3000/essay/1.xml" 
                   (lambda (status)
                     (switch-to-buffer (current-buffer))
                     ))))


Answer 2:

随着twit.el,有一个小放屁周围,使其工作。 认证信息存储在一个ALIST内。 这是一个列表绑定到变量符号url-basic-auth-storage

ELISP> (require 'url)
ELISP> (pp url-basic-auth-storage)
url-http-real-basic-auth-storage

ELISP> (pp (symbol-value url-basic-auth-storage))
(("twitter.com:443"  ("Twitter API" . "@uTh5tr!n6==")) 
 ("twitter.com:80"  ("Twitter API" . "AnotherAuthString==")))
ELISP> 

你也许可以做这样的事情:

(let ((my-temporary-auth '(("host.com:80" ("Auth Realm" . "@uTH5r!n6==")))))
      (url-basic-auth-storage 'my-temporary-auth))
   (do-gunk))

这将使用户的认证信息单独(如果他们有任何)。 当回想起来可能是去与twit.el.更聪明的方式



文章来源: How does emacs url package handle authentication?
标签: url emacs elisp