什么是API
API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。
简单API接口
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello")
}
func main() {
http.HandleFunc("/hello", helloHandler) http.ListenAndServe(":8080", nil)
}
运行程序并打开http://localhost:8080/,就可以看见Hello!
用户认证
什么是用户认证
用户认证是确认用户身份的过程,确保只有合法用户可以访问你的服务。在API开放给公众使用时,用户认证尤为重要,防止未经授权的访问和滥用。
用户认证方式
- 令牌认证:令牌认证,就是准确的说应该是“Bearer authentication”,Bearer意思就是承载的意思,那么令牌认证可以理解为承载有权访问某资源的令牌。
- API密钥认证:API密钥认证使用率非常高,而且也非常灵活,先来看一下API密钥认证是如何工作的:客户端先去向授权服务器请求到API KEY生成后的KEY可以入库记录,客户端访问API服务的带上API KEY,此API KEY由数字和字母组成,一般至少30个字符长。
- 基本认证:用户通过在请求头中提供用户名和密码进行认证。但是这种方式不够安全,因为密码是明文传输的,容易被截获。
简单示例
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
"net/http"
)
type User struct {
ID uint `json:"id"`
APIKey string `json:"api_key"`
}
func generateAPIKey(userID uint) string {
apiKey := fmt.Sprintf("%d", userID)
return apiKey
}
func verifyAPIKey(user *User, apiKey string) bool {
generatedAPIKey := generateAPIKey(user.ID)
return apiKey == generatedAPIKey
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
userID := r.FormValue("user_id")
user := &User{ID: uint(userID)}
apiKey := r.FormValue("api_key")
if verifyAPIKey(user, apiKey) {
fmt.Fprintln(w, "API Key验证成功")
} else {
fmt.Fprintln(w, "API Key验证失败")
}
}
func main() {
http.HandleFunc("/api/verify", handleRequest)
http.ListenAndServe(":8080", nil)
}