Switch to jwt tokens and allow some extra rdp settings

This commit is contained in:
Bolke de Bruin 2020-07-24 11:54:43 +02:00
parent 3ace4610fc
commit 46e1e9b9f4
7 changed files with 163 additions and 71 deletions

70
security/jwt.go Normal file
View file

@ -0,0 +1,70 @@
package security
import (
"errors"
"fmt"
"github.com/bolkedebruin/rdpgw/protocol"
"github.com/dgrijalva/jwt-go/v4"
"log"
"time"
)
var SigningKey []byte
var ExpiryTime time.Duration = 5
type customClaims struct {
RemoteServer string `json:"remoteServer"`
jwt.StandardClaims
}
func VerifyPAAToken(s *protocol.SessionInfo, tokenString string) (bool, error) {
token, err := jwt.ParseWithClaims(tokenString, &customClaims{}, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return SigningKey, nil
})
if err != nil {
return false, err
}
if _, ok := token.Claims.(*customClaims); ok && token.Valid {
return true, nil
}
log.Printf("token validation failed: %s", err)
return false, err
}
func GeneratePAAToken(username string, server string) (string, error) {
if len(SigningKey) < 32 {
return "", errors.New("token signing key not long enough or not specified")
}
exp := &jwt.Time{
Time: time.Now().Add(time.Minute * 5),
}
now := &jwt.Time{
Time: time.Now(),
}
c := customClaims{
RemoteServer: server,
StandardClaims: jwt.StandardClaims{
ExpiresAt: exp,
IssuedAt: now,
Issuer: "rdpgw",
Subject: username,
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS512, c)
if ss, err := token.SignedString(SigningKey); err != nil {
log.Printf("Cannot sign PAA token %s", err)
return "", err
} else {
return ss, nil
}
}