搜尋
首頁後端開發Golang製作漂亮的 API 金鑰

Making Beautiful API Keys

摘要: AgentStation 為了提升開發者體驗,創建了 uuidkey 包,將 UUID 編碼成美觀易讀的 API 密鑰。該套件支援 UUIDv7,並可解碼密鑰以便資料庫排序和索引。

問題:

API 金鑰是使用者與 AgentStation 產品初次互動的重要環節。我們希望密鑰既美觀又易用,但業界似乎缺乏統一標準。作為一家以開發者為中心的新創公司,我們投入時間和精力尋找理想的解決方案。

大多數 API 金鑰都很糟糕:

我們對 API 金鑰提出了以下要求:

  • 安全
  • 全域唯一
  • 可排序
  • 在 Postgres 中效能優異
  • 外觀美觀

然而,大多數 API 金鑰都缺乏美感,通常是格式不一致的隨機字符,難以閱讀、排序和識別。 我們希望 API 金鑰也具備美感,如同生活中美好的事物一樣對稱。

我們拒絕的 ID:

過於隨機、容易猜測、外觀難看……都不盡人意。

  • 整數和 BigInt: 簡單易讀,易於排序。但它們會暴露密鑰數量,且容易猜測,安全性不足。
  • NanoIDs: 提供完全隨機、可自訂的 ID,特別適合面向大眾的識別碼。但缺乏用於排序和調試的時間戳資訊。
  • UUIDs: 業界標準,有兩個版本值得考慮:
    • UUIDv4:純隨機字符,簡單有效。
    • UUIDv7:包含時間戳,方便除錯和資料庫查詢排序。
  • ULIDs: 包含時間戳並使用 Base32 編碼,提高可讀性。但我們更傾向於 UUID 原生的 Postgres 支持,且其美觀仍不足。

我們的解:

由於現有方案的美觀性(對稱性)不足,我們創建了自己的方法:

  1. 使用 UUIDv7 作為基礎 ID,利用時間戳資訊。
  2. 使用 Crockford Base32 編碼提高可讀性。
  3. 添加美觀的破折號以增強視覺效果。

結果:

<code>key, _ := uuidkey.Encode("d1756360-5da0-40df-9926-a76abff5601d")
fmt.Println(key) // Output: 38QARV0-1ET0G6Z-2CJD9VA-2ZZAR0X</code>

我們的金鑰:

  • 31 個字元(不含破折號為 28 個),比 UUID 的 36 個字元更短。
  • 高度可讀的段落,包含 4 組 7 個大寫字母和數字,具有「塊狀」的美感和可讀性。
  • 以解碼後的 UUID 形式儲存時,可以按時間順序排序。
  • 使用者可見的金鑰中時間戳被模糊處理(但精通技術的使用者仍然可以解碼)。我們認為金鑰中的時間戳記資料是額外的好處,您也可以選擇使用 UUIDv4!

為什麼選擇 UUIDv7?

除了時間戳記的優勢外,UUIDv7 將在 Postgres v18 中獲得原生支援。雖然目前可以使用擴充功能在伺服器端產生 UUIDv7,但原生 Postgres 支援的效能肯定會更好,並且可以很好地與 uuidkey.Encode() 配合使用。

在我們的實作中,我們目前在應用程式層產生金鑰,並將其作為 UUID 儲存以進行排序和索引。一旦發布 Postgres v18,我們將切換到 Postgres 生成,以減輕應用程式層的負載並獲得更好的效能。

為什麼選擇 Crockford Base32?

我們選擇 Crockford Base32 編碼是因為它:

  • 只使用大寫字母和數字,提高了可讀性。
  • 將密鑰長度減少約 1/5。
  • 映射高效且可預測。

為什麼要用破折號?

有破折號的金鑰「塊狀」且對稱。如果將各個字元灰顯,它們看起來幾乎像是條碼。我們認為這使得快速讀取密鑰的一部分以識別它變得容易。

破折號確實會移除方便的雙擊複製功能,但我們認為這是為了可讀性而值得的權衡。我們不希望用戶到處複製貼上它們,事實上我們希望它們得到謹慎處理。理想情況下,使用者只在我們的儀表板中產生金鑰時複製一次金鑰——因此我們在 UI 中新增了一個複製按鈕來解決這個問題。

uuidkey 包裝:

我們在 github.com/agentstation/uuidkey 上開源了這些設計選擇。如果您認同我們的美學、推理和對稱性,並希望擁有自己美觀的 API 金鑰,歡迎試用我們的開源專案。

uuidkey 套件的核心是透過 Base32-Crockford 編解碼器將 UUID 編碼為可讀的金鑰格式,並將其解碼回 UUID。

編碼:

程式碼片段已在原文中給出,此處不再贅述。

解碼:

程式碼片段已在原文中給出,此處不再贅述。

該套件旨在與遵循官方 UUID 規範 (RFC 4122) 的任何 UUID 配合使用,但我們專門測試並維護與兩個最流行的 UUID Go 生成器的兼容性:

  • Gofrs
  • Google

安裝很簡單:

<code>key, _ := uuidkey.Encode("d1756360-5da0-40df-9926-a76abff5601d")
fmt.Println(key) // Output: 38QARV0-1ET0G6Z-2CJD9VA-2ZZAR0X</code>

基本用法:

<code>go get github.com/agentstation/uuidkey</code>

我們努力將開銷降至最低:

效能基準測試資料已在原文中給出,此處不再贅述。

貢獻給 uuidkey:

我們致力於維護 uuidkey 作為可靠的開源工具,因為我們在生產中使用它——歡迎貢獻!

如果您覺得它有用或有改進建議,我們很樂意在我們的 GitHub issues 或 Discord 社群中聽到您的意見。

先前技術與巨人肩膀:

在我們發布項目後,我們發現了一些具有類似實現的項目,但仍然沒有滿足我們使用 Go 編碼和解碼 UUID 的標準。

  • uuidapikey - Go,但不支援編碼或解碼 UUID 輸入。
  • based_uuid - Ruby,但用於公用 ID。

總結:

在 AgentStation,我們正在建立一個平台,讓 AI 代理程式擁有自己的虛擬工作站來運行瀏覽器、參加會議和執行程式碼。隨著我們擴展到數千個工作站,擁有可排序、高效能的密鑰是實用的基礎設施。

但我們也相信,開發者像我們一樣欣賞對稱的美好事物,即使是 API 金鑰。

我們希望您發現 uuidkey 既實用又美觀。

腳註已在原文中給出,此處不再贅述。

以上是製作漂亮的 API 金鑰的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Golang vs. Python:利弊Golang vs. Python:利弊Apr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

Golang和C:並發與原始速度Golang和C:並發與原始速度Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

為什麼要使用Golang?解釋的好處和優勢為什麼要使用Golang?解釋的好處和優勢Apr 21, 2025 am 12:15 AM

選擇Golang的原因包括:1)高並發性能,2)靜態類型系統,3)垃圾回收機制,4)豐富的標準庫和生態系統,這些特性使其成為開發高效、可靠軟件的理想選擇。

Golang vs.C:性能和速度比較Golang vs.C:性能和速度比較Apr 21, 2025 am 12:13 AM

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

golang比C快嗎?探索極限golang比C快嗎?探索極限Apr 20, 2025 am 12:19 AM

Golang在編譯時間和並發處理上表現更好,而C 在運行速度和內存管理上更具優勢。 1.Golang編譯速度快,適合快速開發。 2.C 運行速度快,適合性能關鍵應用。 3.Golang並發處理簡單高效,適用於並發編程。 4.C 手動內存管理提供更高性能,但增加開發複雜度。

Golang:從Web服務到系統編程Golang:從Web服務到系統編程Apr 20, 2025 am 12:18 AM

Golang在Web服務和系統編程中的應用主要體現在其簡潔、高效和並發性上。 1)在Web服務中,Golang通過強大的HTTP庫和並發處理能力,支持創建高性能的Web應用和API。 2)在系統編程中,Golang利用接近硬件的特性和對C語言的兼容性,適用於操作系統開發和嵌入式系統。

Golang vs.C:基準和現實世界的表演Golang vs.C:基準和現實世界的表演Apr 20, 2025 am 12:18 AM

Golang和C 在性能對比中各有優劣:1.Golang適合高並發和快速開發,但垃圾回收可能影響性能;2.C 提供更高性能和硬件控制,但開發複雜度高。選擇時需綜合考慮項目需求和團隊技能。

Golang vs. Python:比較分析Golang vs. Python:比較分析Apr 20, 2025 am 12:17 AM

Golang适合高性能和并发编程场景,Python适合快速开发和数据处理。1.Golang强调简洁和高效,适用于后端服务和微服务。2.Python以简洁语法和丰富库著称,适用于数据科学和机器学习。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版