How does emacs url package handle authentication?

限于喜欢 提交于 2019-12-19 09:12:53

问题


I have not seen a really good example on the web. How can I add authentication to a request like this:

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

if for example, the user and pass is admin:admin?


回答1:


I got the impression that url.el was designed mostly for interactive operations, i.e. you do a call without authorisation, the server responds with a 403 "authorization needed" (correct code?) status and url.el will query the user for user name and password.

You can have a look at my code on http://github.com/hdurer/fluiddb.el where I try to do things programmatically.

Basically, I create the HTTP authorzation header myself (base64 encoding the correctly formatted string and adding the correct header to url-request-extra-headers). Then in a second step I need to add advice to url-http-handle-authentication so that it won't ask the user should the passed credentials not be acceptable.

This feels a lot like raping url.el but it works for me and is the only way I could make it work.


Your code would thus look something like this:

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



回答2:


With twit.el, there was a little farting around to make it work. Authentication info is stored inside of an alist. This a list is bound to the symbol in the variable 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> 

You could probably do something like this:

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

This will leave the users authentication info alone (if they have any). Upon retrospect that might have been the smarter way to go with twit.el.



来源:https://stackoverflow.com/questions/1597959/how-does-emacs-url-package-handle-authentication

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!