P粉7397060892023-08-04 09:11:43
看起來問題出在你傳給jwt_encode_hmac()的secret=參數。 charToRaw函數無法理解十六進位數字,它只使用ASCII字元碼。要進行轉換,你需要使用現有問題中的其中一個hex_to_raw函數。我在這裡使用一個函數來進行轉換。
hex_to_raw <- function(x) { digits <- strtoi(strsplit(x, "")[[1]], base=16L) as.raw(bitwShiftL(digits[c(TRUE, FALSE)],4) + digits[c(FALSE, TRUE)]) }
另外,你不需要在頭部指定alg和typ,因為這些會由函數自動加入。所以你可以使用以下方式建立你的令牌:
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 )
我使用https://jwt.io/上的調試器測試了每個令牌,它們似乎是等價的。在偵錯器中,十六進位值"12bd18f2cd12"的Base64編碼值是"Er0Y8s0S"。