cari

Rumah  >  Soal Jawab  >  teks badan

Antara muka R ke Ghost CMS API

<p>Saya cuba menyambung ke contoh Ghost CMS tempatan daripada R menggunakan API Pentadbiran terbina dalam. Terdapat dokumentasi yang baik (https://ghost.org/docs/admin-api/#token-authentication) tentang cara menyambung dalam pelbagai bahasa, tetapi malangnya tiada dokumentasi untuk R. Saya telah menulis kod berikut tetapi malangnya saya menerima ralat 401 apabila cuba membuat artikel ujian. Sebarang bantuan amatlah dihargai. <br /><br />Kod R:</p><p><strong></strong></p> <pre class="brush:php;toolbar:false;">api_admin_key <- "xxxxxx:yyyyyyyyyyyyyyy" api_admin_key <- unlist(strsplit(x = api_admin_key, split = ":")) nama(kunci_admin_api) <- c("id", "rahsia") # Sediakan pengepala dan muatan iat <- as.integer(Sys.time()) pengepala <- list(alg = 'HS256', typ = 'JWT', kid = api_admin_key[["id"]]) # Buat token (termasuk rahsia penyahkodan) muatan <- jose::jwt_claim(iat = iat, exp = iat + 5 * 60, aud = '/admin/') token <- jose::jwt_encode_hmac( tuntutan = muatan, rahsia = charToRaw(api_admin_key[["rahsia"]]), saiz = 256, pengepala = pengepala ) # Buat permintaan yang disahkan untuk membuat siaran url <- 'http://localhost:2368/ghost/api/admin/posts/' pengepala <- c('Keizinan' = tampal("Hantu", token)) badan <- senarai(siaran = senarai( "title" = 'Hello World', "html" = "<p>Kandungan siaran saya. Kerja sedang dijalankan...</p>", "status" = "diterbitkan" ) ) httr::POST(url, badan = badan, encode = "json", httr::add_headers(.headers = headers))</pre> <p><br /></p>
P粉134288794P粉134288794483 hari yang lalu564

membalas semua(1)saya akan balas

  • P粉739706089

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

    Nampaknya masalahnya ialah dengan parameter secret= yang anda hantar ke jwt_encode_hmac(). Fungsi charToRaw tidak dapat memahami nombor perenambelasan, ia hanya menggunakan kod aksara ASCII. Untuk melakukan penukaran, anda perlu menggunakan salah satu fungsi hex_to_raw daripada soalan sedia ada. Saya menggunakan fungsi di sini untuk melakukan penukaran.

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

    Selain itu, anda tidak perlu menentukan alg dan taip dalam pengepala kerana ini akan ditambah secara automatik oleh fungsi. Jadi anda boleh membina token anda menggunakan:

    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
      )

    Saya menguji setiap token menggunakan penyahpepijat di https://jwt.io/ dan ia kelihatan setara. Dalam penyahpepijat, nilai dikodkan Base64 bagi nilai perenambelasan "12bd18f2cd12" ialah "Er0Y8s0S".

    balas
    0
  • Batalbalas