emacs url包如何处理身份验证?

时间:2009-10-20 23:45:01

标签: url emacs elisp

我还没有在网上看到一个非常好的例子。如何为这样的请求添加身份验证:

(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))
                    ))))

例如,如果用户和pass是admin:admin?

2 个答案:

答案 0 :(得分:7)

我的印象是url.el主要是为了交互式操作而设计的,即您在未经授权的情况下进行呼叫,服务器会响应403“需要授权”(正确的代码?)状态和url.el将查询用户的用户名和密码。

您可以在http://github.com/hdurer/fluiddb.el上查看我的代码,我会尝试以编程方式执行操作。

基本上,我自己创建HTTP授权标头(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))
                     ))))

答案 1 :(得分:3)

使用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可能是更聪明的方式。