anylink/server/dbdata/otp_auth.go

60 lines
1.3 KiB
Go

package dbdata
import (
"encoding/json"
"fmt"
"github.com/spf13/viper"
"io"
"log"
"net/http"
)
type OtpAuthResult struct {
User string `json:"user"`
TokenValid bool `json:"token_valid"`
}
func ValidateUserOtp(name string, otp int) (bool, error) {
v := viper.New()
v.SetConfigFile("./conf/server.toml")
if err := v.ReadInConfig(); err != nil {
panic("config file err:" + err.Error())
}
// 验证动态口令
otpServ := v.Get("otp_server")
otpAuthUrl := fmt.Sprintf("%s/%s/token/%d", otpServ, name, otp)
fmt.Println("otpAuthUrl: ", otpAuthUrl)
resp, err := http.Get(otpAuthUrl)
if err != nil || resp.StatusCode != 200 {
log.Fatalf("otp server auth err, user=[%s], token=[%d], httpcode=[%d], err=[%v]", name, otp, resp.StatusCode, err)
return false, err
}
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
panic(err)
}
}(resp.Body)
b, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("io.ReadAll read http response body failed, err=[%v]", err)
return false, err
}
var optAuthResult OtpAuthResult
err = json.Unmarshal(b, &optAuthResult)
if err != nil {
log.Fatalf("unmarshalotp retmsg failed, user=[%s], token=[%d], httpcode=[%d], err=[%v]", name, otp, resp.StatusCode, err)
return false, err
}
return optAuthResult.TokenValid, nil
}