package auth2
import (
"log"
"strings"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
type TokenExtractor func(*gin.Context) string
func FromHeader(ctx *gin.Context) string {
authHeader := ctx.GetHeader("Authorization")
if authHeader == "" {
return ""
}
authHeaderParts := strings.Split(authHeader, " ")
if len(authHeaderParts) != 2 || strings.ToLower(authHeaderParts[0]) != "bearer" {
return ""
}
return authHeaderParts[1]
}
func FromQuery(ctx *gin.Context) string {
return ctx.Query("token")
}
func FromJSON(jsonKey string) TokenExtractor {
return func(ctx *gin.Context) string {
if ctx.ContentType() != binding.MIMEJSON {
log.Printf("extractor: content-type %s not supported\n", ctx.ContentType())
return ""
}
var m gin.H
if err := ctx.BindJSON(&m); err != nil {
log.Println("extractor: bind json error:", err.Error())
return ""
}
if m == nil {
log.Println("extractor: json is empty")
return ""
}
v, ok := m[jsonKey]
if !ok {
log.Printf("extractor: key %s not found\n", jsonKey)
return ""
}
tok, ok := v.(string)
if !ok {
log.Printf("extractor: key %s value:[%v] is not a string\n", jsonKey, v)
return ""
}
return tok
}
}