guile-user
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]