2024/12/05 18:34:58
部署 Token 服务器
Token 需要在你的服务端部署生成。当客户端发送请求时,服务端部署的 Token Generator 会生成相应的 Token,再发送给客户端。本文展示如何为 AccessToken2 在服务端部署一个 RTM Token 生成器。
前提条件
开始前,请确保你的项目或使用的声网产品满足如下条件:
-
Golang 1.14 以上版本,GO111MODULE 设置为开启。
信息如果你使用的是 Go 1.16 及以上版本,GO111MODULE 已默认开启。详见 New module changes in Go 1.16。
实现部署 Token 服务器
本节展示如何使用 Golang 在你的本地设备上搭建并运行一个 Token 服务器,生成并提供 Token。
信息
此示例服务器仅用于演示,请勿用于生产环境中。
-
创建一个
server.go
文件,然后贴入如下代码。将其中的<Your App ID>
和<Your App Certificate>
替换为你的 App ID 和 App 证书。Gopackage main
import (
rtmtokenbuilder "github.com/AgoraIO/Tools/DynamicKey/AgoraDynamicKey/go/src/rtmtokenbuilder2"
"fmt"
"log"
"net/http"
"time"
"encoding/json"
"errors"
"strconv"
)
type rtm_token_struct struct{
Uid_rtm string `json:"uid"`
}
var rtm_token string
var rtm_uid string
// 使用 RtmTokenBuilder 来生成 RTM Token
func generateRtmToken(rtm_uid string){
appID := "Your_App_ID"
appCertificate := "Your_Certificate"
// AccessToken2 过期的时间,单位为秒
expireTimeInSeconds := uint32(3600)
currentTimestamp := uint32(time.Now().UTC().Unix())
expireTimestamp := currentTimestamp + expireTimeInSeconds
result, err := rtmtokenbuilder.BuildToken(appID, appCertificate, rtm_uid, expireTimestamp)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Rtm Token: %s\n", result)
rtm_token = result
}
}
func rtmTokenHandler(w http.ResponseWriter, r *http.Request){
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS");
w.Header().Set("Access-Control-Allow-Headers", "*");
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
if r.Method != "POST" && r.Method != "OPTIONS" {
http.Error(w, "Unsupported method. Please check.", http.StatusNotFound)
return
}
var t_rtm_str rtm_token_struct
var unmarshalErr *json.UnmarshalTypeError
str_decoder := json.NewDecoder(r.Body)
rtm_err := str_decoder.Decode(&t_rtm_str)
if (rtm_err == nil) {
rtm_uid = t_rtm_str.Uid_rtm
}
if (rtm_err != nil) {
if errors.As(rtm_err, &unmarshalErr){
errorResponse(w, "Bad request. Please check your params.", http.StatusBadRequest)
} else {
errorResponse(w, "Bad request.", http.StatusBadRequest)
}
return
}
generateRtmToken(rtm_uid)
errorResponse(w, rtm_token, http.StatusOK)
log.Println(w, r)
}
func errorResponse(w http.ResponseWriter, message string, httpStatusCode int){
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.WriteHeader(httpStatusCode)
resp := make(map[string]string)
resp["token"] = message
resp["code"] = strconv.Itoa(httpStatusCode)
jsonResp, _ := json.Marshal(resp)
w.Write(jsonResp)
}
func main(){
// 使用 int 型 uid 生成 RTM Token
http.HandleFunc("/fetch_rtm_token", rtmTokenHandler)
fmt.Printf("Starting server at port 8082\n")
if err := http.ListenAndServe(":8082", nil); err != nil {
log.Fatal(err)
}
} -
go.mod
文件定义导入路径及依赖项。运行如下命令来为你的 Token 服务器创建go.mod
文件:Shell$ go mod init sampleServer
-
运行如下命令行安装依赖:
Shell$ go get
-
运行如下命令行启动服务器:
Shell$ go run server.go
信息
如果你需要生成一个同时具备 RTC 和 RTM 权限的 Token,请参考如何生成具备 RTC 和 RTM 权限的 Token?。
参考
AccessToken2 生成器代码
声网在 GitHub 上提供一个开源的 AgoraDynamicKey 仓库,支持使用 C++、Java、Go 等语言在你自己的服务器上生成 Token。
语言 | 算法 | 核心方法 | 示例代码 |
---|---|---|---|
C++ | HMAC-SHA256 | buildToken | RtmTokenBuilder2Sample.cpp |
Go | HMAC-SHA256 | buildToken | sample.go |
Java | HMAC-SHA256 | buildToken | RtmTokenBuilder2Sample.java |
PHP | HMAC-SHA256 | buildToken | RtmTokenBuilder2Sample.php |
Python 2 | HMAC-SHA256 | buildToken | RtmTokenBuilder2Sample.py |
Python 3 | HMAC-SHA256 | buildToken | RtmTokenBuilder2Sample.py |
BuildToken API 参考
本节介绍生成 AccessToken2 的 API 参数和描述。以 Golang 为例:
Go
func BuildToken(appId string, appCertificate string, userId string, expire uint32) (string, error) {
token := accesstoken.NewAccessToken(appId, appCertificate, expire)
serviceRtm := accesstoken.NewServiceRtm(userId)
serviceRtm.AddPrivilege(accesstoken.PrivilegeLogin, expire)
token.AddService(serviceRtm)
return token.Build()
}
参数 | 描述 |
---|---|
appId | 你在声网控制台创建项目时生成的 App ID。 |
appCertificate | 你的 App 证书。 |
userId | 用户 ID,用于标识用户或设备。为区分各用户和设备,你需要确保 userId 全局唯一,并且在用户或设备的生命周期内保持不变。 |
expire | Token 的有效时长(秒),最长有效期为 24 小时。 |