如何将我们的服务开放给用户:构建 API 接口和用户认证的实践| 青训营

36 阅读2分钟

API 身份验证和授权的最佳实践

虽然我们经常把授权和身份校验这两个功能混为一谈,但是实际上授权和身份校验是两个独立的功能。身份验证是验证用户是谁(who?)的过程,而授权是验证这些用户是否具有权利去访问内容的过程。

应用程序编程接口 (API) 使计算机程序能够相互通信。由于 API 隐藏了系统工作方式的内部细节,同时提供了一个系统可以通信和执行操作的安全接口,因此程序员用来访问 API 的方式至关重要。API 安全性取决于身份验证和授权机制的正确配置。

JSON Web Token (JWT) 通常用于实现基于密钥的客户端身份验证。客户端生成 JWT 并使用私钥对其进行签名。然后,API 使用客户端的公钥验证 JWT,并使用嵌入的声明做出授权决策。由于 JWT 的性质,在实现客户端身份验证方案时有很多自由度。

已签名的 JWT 只能用于在发出时间戳和过期时间戳之间的有效时段内调用特定终结点。JWT 通常使用自定义标头包含在请求中。

处理多个客户端时,还建议在 JWT 的标头中包含密钥标识符。这有助于 API 从密钥提供程序检索此特定客户端的正确密钥。验证 JWT 签名后,API 应确保声明与用于检索密钥的标识相对应。 下面我们以go语言搭建的项目为例介绍一下如何构建API接口。

构建API接口

首先,我们必须创建一个非常简单的服务器来处理HTTP请求。为此,我们创建一个名为main.go的新文件。 在这个main.go文件中,我们将要定义3个不同的函数。一个page函数(将处理对我们根URL的所有请求),router函数(将与已定义函数匹配的URL路径匹配)和main函数(将启动我们的API)

package main

import (
    "fmt"
    "log"
    "net/http"
)

func page(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "Hello!")
}

func router() {
    http.HandleFunc("/", page)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func main() {
    router()
}