Maison  >  Questions et réponses  >  le corps du texte

Interface R vers l'API Ghost CMS

<p>J'essaie de me connecter à une instance Ghost CMS locale à partir de R à l'aide de l'API d'administration intégrée. Il existe une bonne documentation (https://ghost.org/docs/admin-api/#token-authentication) sur la façon de se connecter dans différentes langues, mais malheureusement il n'y a pas de documentation pour R. J'ai écrit le code suivant mais je reçois malheureusement une erreur 401 lorsque j'essaie de créer un article de test. Toute aide est grandement appréciée. <br /><br />Code R :</p><p><strong></strong></p> <pre class="brush:php;toolbar:false;">api_admin_key <- "xxxxxx:aaaayyyyyyyyyyy" api_admin_key <- unlist(strsplit(x = api_admin_key, split = ":")) noms(api_admin_key) <- c("id", "secret") # Préparer l'en-tête et la charge utile iat <- as.integer(Sys.time()) en-tête <- liste(alg = 'HS256', typ = 'JWT', kid = api_admin_key[["id"]]) # Créer le jeton (y compris le secret de décodage) charge utile <- jose::jwt_claim(iat = iat, exp = iat + 5 * 60, aud = '/admin/') jeton <- jose::jwt_encode_hmac( réclamation = charge utile, secret = charToRaw(api_admin_key[["secret"]]), taille = 256, en-tête = en-tête ) # Faire une demande authentifiée pour créer une publication url <- 'http://localhost:2368/ghost/api/admin/posts/' en-têtes <- c('Autorisation' = coller("Ghost", jeton)) corps <- liste(messages = liste( "titre" = 'Bonjour tout le monde', "html" = "<p>Contenu de mon message. Travail en cours...</p>", "statut" = "publié" ) ) httr::POST(url, corps = corps, encoder = "json", httr::add_headers(.headers = en-têtes))</pre> <p><br /></p>
P粉134288794P粉134288794444 Il y a quelques jours529

répondre à tous(1)je répondrai

  • P粉739706089

    P粉7397060892023-08-04 09:11:43

    On dirait que le problème vient du paramètre secret= que vous transmettez à jwt_encode_hmac(). La fonction charToRaw ne peut pas comprendre les nombres hexadécimaux, elle utilise uniquement les codes de caractères ASCII. Pour effectuer la conversion, vous devez utiliser l'une des fonctions hex_to_raw de la question existante. J'utilise une fonction ici pour effectuer la conversion.

    hex_to_raw <- function(x) {
      digits <- strtoi(strsplit(x, "")[[1]], base=16L)
      as.raw(bitwShiftL(digits[c(TRUE, FALSE)],4) + digits[c(FALSE, TRUE)])
    }

    De plus, vous n'avez pas besoin de spécifier alg et de saisir l'en-tête car ceux-ci seront ajoutés automatiquement par la fonction. Vous pouvez donc construire votre token en utilisant :

    api_admin_key <- "adam:12bd18f2cd12"
    
    api_admin_key <- unlist(strsplit(x = api_admin_key, split = ":"))
    names(api_admin_key) <- c("id", "secret")
    
    # Prepare header and payload
    iat <- as.integer(Sys.time())
    header <- list(kid = api_admin_key[["id"]])
    
    # Create the token (including decoding secret)
    payload <-
      jose::jwt_claim(iat = iat,
                      exp = iat + 5 * 60,
                      aud = '/admin/')
    
    token <-
      jose::jwt_encode_hmac(
        claim = payload,
        secret = hex_to_raw(api_admin_key[["secret"]]),
        size = 256,
        header = header
      )

    J'ai testé chaque jeton à l'aide du débogueur sur https://jwt.io/ et ils semblent être équivalents. Dans le débogueur, la valeur codée en Base64 de la valeur hexadécimale « 12bd18f2cd12 » est « Er0Y8s0S ».

    répondre
    0
  • Annulerrépondre