2009-10-20 62 views
4

我还没有在网上看到一个很好的例子。我如何添加认证到这样的请求:emacs url包如何处理认证?

(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:管理员?

回答

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)) 
        )))) 
+0

感谢您的评论。我已经阅读了twit.el,twitter.el和mediawiki.el的资源,但是我还没有弄清楚他们正在做什么以进行身份​​验证。我也会检查你的。再次感谢! – wallyqs 2009-10-22 17:49:38

+0

一个完全不同的解决方案可能是不使用url.el - 我只看了一下identica模式(就是google的模式),那里的HTTP请求是完全手动组装的。对我来说,这感觉有点像重新发明轮子。 – 2009-10-22 20:28:28

+0

我使用的twiter模式(twit.el)不会以编程方式进行身份验证,而是依赖于url.el - 即用户会在第一次请求时询问twitter的名称和密码。 – 2009-10-22 20:30:08

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.

+0

然而,你仍然需要defadvice破解,除非你想url.rl可能要求用户输入其他auth信息吗? (这意味着服务仍然返回一个403,尽管发送了授权头。) – 2009-10-23 15:39:52

+0

您不应该需要defadvice hack。如果我记得,url-http-handle-authentication使用url-http-basic-authorization作为auth缓存,所以如果在alist中已经有一个条目,它将不会提示用户,除非获得第二个403头。 – 2009-10-23 21:53:20

+0

感谢Jonathan为你的答案(和twit.el),我目前使用HD的方法,尽管我发现twit.el源也很有用,以便学习更多关于如何使用url.el的知识。 – wallyqs 2009-10-26 00:34:11