1 Commits

Author SHA1 Message Date
edmand46 b57f170ba4 sdk: Players.VerifyAuth and VerifyWebhookSignature helper
CI / build (push) Successful in 55s
2026-08-28 13:36:03 +03:00
6 changed files with 66 additions and 0 deletions
+21
View File
@@ -140,6 +140,27 @@ unbanned, err := client.Players.Unban(ctx, rudder.UnbanPlayersParameters{
err = client.Players.Delete(ctx, rudder.DeletePlayersParameters{ err = client.Players.Delete(ctx, rudder.DeletePlayersParameters{
PlayerIDs: []string{"p3"}, PlayerIDs: []string{"p3"},
}) })
```
## Верификация авторизации
`Players.VerifyAuth` — одиночный (не batch) вызов `POST /players/auth/verify`:
проверяет access token игрока и возвращает `playerId`, `projectId` и `status`
(`active`/`banned`/`deleted`).
```go
verification, err := client.Players.VerifyAuth(ctx, accessToken)
// verification.PlayerID, verification.ProjectID, verification.Status
```
`VerifyWebhookSignature` — пакетный хелпер для приёма webhook'ов с подписью
`X-Signature` (hex HMAC-SHA256 от сырого тела, ключ — webhook secret проекта):
```go
if !rudder.VerifyWebhookSignature(secret, body, r.Header.Get("X-Signature")) {
// подпись не сошлась — отклонить запрос
}
```
err = client.Quests.Reset(ctx, rudder.PlayerQuestsParameters{ err = client.Quests.Reset(ctx, rudder.PlayerQuestsParameters{
Items: []rudder.PlayerQuestRef{ Items: []rudder.PlayerQuestRef{
+7
View File
@@ -0,0 +1,7 @@
// Code generated by apigen. DO NOT EDIT.
package models
type VerifyPlayerAuthRequest struct {
AccessToken string `json:"accessToken,omitempty"`
}
+9
View File
@@ -0,0 +1,9 @@
// Code generated by apigen. DO NOT EDIT.
package models
type VerifyPlayerAuthResponse struct {
PlayerID string `json:"playerId,omitempty"`
ProjectID string `json:"projectId,omitempty"`
Status string `json:"status,omitempty"`
}
+10
View File
@@ -46,6 +46,16 @@ func (s *PlayersService) Get(ctx context.Context, playerID string) (*PlayerDetai
return &response, nil return &response, nil
} }
func (s *PlayersService) VerifyAuth(ctx context.Context, accessToken string) (*PlayerAuthVerification, error) {
body := models.VerifyPlayerAuthRequest{AccessToken: accessToken}
var response PlayerAuthVerification
if err := s.transport.do(ctx, http.MethodPost, "/players/auth/verify", nil, body, &response); err != nil {
return nil, err
}
return &response, nil
}
type UpdatePlayersParameters struct { type UpdatePlayersParameters struct {
IdempotencyKey string IdempotencyKey string
Items []PlayerUpdate Items []PlayerUpdate
+1
View File
@@ -10,6 +10,7 @@ type PlayerDetails = models.AdminPlayerDetails
type PlayerList = models.ListPlayersResponse type PlayerList = models.ListPlayersResponse
type PlayerUpdate = models.BatchUpdatePlayersItem type PlayerUpdate = models.BatchUpdatePlayersItem
type PlayerBan = models.BatchBanPlayersItem type PlayerBan = models.BatchBanPlayersItem
type PlayerAuthVerification = models.VerifyPlayerAuthResponse
type WalletBalance = models.WalletDetails type WalletBalance = models.WalletDetails
type WalletTransaction = models.WalletAudit type WalletTransaction = models.WalletAudit
+18
View File
@@ -0,0 +1,18 @@
package rudder
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
)
func VerifyWebhookSignature(secret string, body []byte, signature string) bool {
mac := hmac.New(sha256.New, []byte(secret))
mac.Write(body)
expected, err := hex.DecodeString(signature)
if err != nil {
return false
}
return hmac.Equal(mac.Sum(nil), expected)
}