[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: http-request bearer token syntax for Twitter v2 api
From: |
Ricardo Wurmus |
Subject: |
Re: http-request bearer token syntax for Twitter v2 api |
Date: |
Thu, 13 Oct 2022 13:37:56 +0200 |
User-agent: |
mu4e 1.8.9; emacs 28.1 |
Hi Mortimer,
> Has anyone successfully submitted a bearer token to Twitter v2 api using
> http-request? What syntax did you use?
The validator for the Authorization header does not permit the “bearer”
method with a single string. It expects that authentication methods
other than Basic always provide key=value arguments.
So we have to overwrite things:
--8<---------------cut here---------------start------------->8---
(import (ice-9 pretty-print)
(ice-9 match)
(json)
(rnrs bytevectors)
(web client)
(web http)
(web request)
(web response))
(define* (parse-credentials str #:optional (val-parser (@@ (web http)
default-val-parser))
(start 0) (end (string-length str)))
(let* ((start ((@@ (web http) skip-whitespace) str start end))
(delim (or (string-index str char-set:whitespace start end) end)))
(when (= start end)
((@@ (web http) bad-header-component) 'authorization str))
(let ((scheme (string->symbol
(string-downcase (substring str start (or delim end))))))
(case scheme
((bearer)
(let* ((start ((@@ (web http) skip-whitespace) str delim end)))
(unless (< start end) (pk 'oh start end str)
((@@ (web http) bad-header-component) 'token str))
(cons scheme (substring str start end))))
(else
((@@ (web http) parse-credentials)
str val-parser start end))))))
(define (validate-credentials val)
(match val
(((or 'basic 'bearer) . (? string?)) #t)
(((? symbol?) . (? (@@ (web http) key-value-list?))) #t)
(_ #f)))
(define put-string (@@ (web http) put-string))
(define (write-credentials val port)
(match val
(('bearer . cred)
(put-string port "bearer ")
(put-string port cred))
(_ ((@@ (web http) write-credentials) val port))))
(declare-header! "authorization"
parse-credentials
validate-credentials
write-credentials)
(let* ((uri
"https://api.twitter.com/2/users/2244994945/tweets?tweet.fields=created_at&expansions=author_id&user.fields=created_at&max_results=5")
(my-token "AAA...")
(my-headers `((Content-type . "application/json")
(authorization . (bearer . ,my-token)))))
(call-with-values (lambda () (http-get uri #:headers my-headers))
(lambda (response body)
(pretty-print response)
(pretty-print (json-string->scm (utf8->string body))))))
--8<---------------cut here---------------end--------------->8---
Note that the POST endpoint for submitting tweets does not allow bearer
token authentication.
--
Ricardo