99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
|
||
|
"time"
|
||
|
|
||
|
"github.com/livekit/protocol/auth"
|
||
|
)
|
||
|
|
||
|
type Handler struct {
|
||
|
key, secret string
|
||
|
}
|
||
|
|
||
|
func (h *Handler) handle(w http.ResponseWriter, r *http.Request) {
|
||
|
log.Printf("Request from %s", r.RemoteAddr)
|
||
|
|
||
|
// Set the CORS headers
|
||
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||
|
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
|
||
|
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
|
||
|
|
||
|
// Handle preflight request (CORS)
|
||
|
if r.Method == "OPTIONS" {
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
roomName := r.URL.Query().Get("roomName")
|
||
|
name := r.URL.Query().Get("name")
|
||
|
identity := r.URL.Query().Get("identity")
|
||
|
|
||
|
log.Printf("roomName: %s, name: %s, identity: %s", roomName, name, identity)
|
||
|
|
||
|
if roomName == "" || name == "" || identity == "" {
|
||
|
w.WriteHeader(http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
token, err := getJoinToken(h.key, h.secret, roomName, identity, name)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
res := Response{token}
|
||
|
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
json.NewEncoder(w).Encode(res)
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
key := os.Getenv("LIVEKIT_KEY")
|
||
|
secret := os.Getenv("LIVEKIT_SECRET")
|
||
|
|
||
|
// Check if the key and secret are empty.
|
||
|
if key == "" || secret == "" {
|
||
|
log.Fatal("LIVEKIT_KEY and LIVEKIT_SECRET environment variables must be set")
|
||
|
}
|
||
|
|
||
|
log.Printf("LIVEKIT_KEY: %s and LIVEKIT_SECRET %s", key, secret)
|
||
|
|
||
|
handler := &Handler{
|
||
|
key: key,
|
||
|
secret: secret,
|
||
|
}
|
||
|
|
||
|
http.HandleFunc("/token", handler.handle)
|
||
|
log.Fatal(http.ListenAndServe(":8080", nil))
|
||
|
}
|
||
|
|
||
|
type Response struct {
|
||
|
Token string `json:"accessToken"`
|
||
|
}
|
||
|
|
||
|
func getJoinToken(apiKey, apiSecret, room, identity, name string) (string, error) {
|
||
|
at := auth.NewAccessToken(apiKey, apiSecret)
|
||
|
|
||
|
canPublish := true
|
||
|
canSubscribe := true
|
||
|
grant := &auth.VideoGrant{
|
||
|
RoomJoin: true,
|
||
|
RoomCreate: true,
|
||
|
CanPublish: &canPublish,
|
||
|
CanSubscribe: &canSubscribe,
|
||
|
Room: room,
|
||
|
}
|
||
|
|
||
|
at.AddGrant(grant).
|
||
|
SetIdentity(identity).
|
||
|
SetValidFor(time.Hour).
|
||
|
SetName(name)
|
||
|
|
||
|
return at.ToJWT()
|
||
|
}
|