2009-10-20 72 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