Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b57f170ba4 |
@@ -140,6 +140,27 @@ unbanned, err := client.Players.Unban(ctx, rudder.UnbanPlayersParameters{
|
||||
err = client.Players.Delete(ctx, rudder.DeletePlayersParameters{
|
||||
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{
|
||||
Items: []rudder.PlayerQuestRef{
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
// Code generated by apigen. DO NOT EDIT.
|
||||
|
||||
package models
|
||||
|
||||
type VerifyPlayerAuthRequest struct {
|
||||
AccessToken string `json:"accessToken,omitempty"`
|
||||
}
|
||||
@@ -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
@@ -46,6 +46,16 @@ func (s *PlayersService) Get(ctx context.Context, playerID string) (*PlayerDetai
|
||||
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 {
|
||||
IdempotencyKey string
|
||||
Items []PlayerUpdate
|
||||
|
||||
@@ -10,6 +10,7 @@ type PlayerDetails = models.AdminPlayerDetails
|
||||
type PlayerList = models.ListPlayersResponse
|
||||
type PlayerUpdate = models.BatchUpdatePlayersItem
|
||||
type PlayerBan = models.BatchBanPlayersItem
|
||||
type PlayerAuthVerification = models.VerifyPlayerAuthResponse
|
||||
|
||||
type WalletBalance = models.WalletDetails
|
||||
type WalletTransaction = models.WalletAudit
|
||||
|
||||
+18
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user