2009-10-20 6 views
4

Я не видел действительно хорошего примера в Интернете. Как добавить аутентификацию в такой запрос:Как проверяет подлинность дескриптора пакета emacs?

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

+0

Совсем другое решение может заключаться в том, чтобы не использовать url.el - я просто просмотрел режим идентификации (просто Google для него), и HTTP-запрос собран полностью вручную. Для меня это немного похоже на изобретательство колеса. –

+0

Режим twiter, который я использую (twit.el), не выполняет программную проверку подлинности, но полагается на url.el - то есть пользователь получает запрос по первому запросу для имени и пароля Twitter. –

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, возможно, попросил у пользователя альтернативные данные авторизации правильно? (Значение, если служба по-прежнему возвращает 403, несмотря на отправленный заголовок авторизации.) –

+0

Вам не нужно разбираться в хакерах. Если я помню, аутентификация url-http-handle использует url-http-basic-authorization в качестве кэша auth, поэтому, если в alist есть запись, она не будет запрашивать пользователя, если только он не получит заголовок 2-го 403 , –

+0

Спасибо Джонатану за ваш ответ (и за twit.el), я в настоящее время пошел на подход HD, хотя я нашел источник twit.el полезным, чтобы узнать больше о том, как использовать url.el. – wallyqs