Полное руководство по интеграции OAuth2 и работе с API
Xneon Skins - это современный сервер аутентификации для Minecraft с поддержкой OAuth2, позволяющий интегрировать систему авторизации в ваши приложения и сервисы.
API предоставляет полный контроль над пользователями, скинами, плащами и OAuth приложениями.
Content-Type: application/jsonAuthorization: Bearer TOKENСоздать приложение можно тут
Следуйте инструкциям в разделе Процесс авторизации
OAuth 2.0 - это протокол авторизации, который позволяет приложениям получать ограниченный доступ к учетным записям пользователей без необходимости передачи пароля.
Наша реализация поддерживает Authorization Code Flow с refresh токенами для безопасной интеграции.
POST /api/oauth/apps
Content-Type: application/json
{
"name": "My App",
"redirectUri": "https://myapp.com/callback",
"description": "Описание приложения",
"userId": "YOUR_USER_ID"
}
GET /oauth/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https://myapp.com/callback&
scope=account_info account_email offline_access
https://myapp.com/callback?code=AUTHORIZATION_CODE
POST /api/oauth2/v1/token
Content-Type: application/json
{
"grant_type": "authorization_code",
"code": "AUTHORIZATION_CODE",
"redirect_uri": "https://myapp.com/callback",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
{
"access_token": "abc123...",
"token_type": "Bearer",
"expires_in": 86400,
"refresh_token": "xyz789..."
}
GET /api/account/v1/info
Authorization: Bearer YOUR_ACCESS_TOKEN
{
"id": 123456,
"uuid": "abc-123-def-456",
"username": "Player",
"registeredAt": 1732262930,
"email": "player@xneon.local"
}
offline_access для получения refresh tokenКогда access token истекает, используйте refresh token для получения нового:
POST /api/oauth2/v1/token
Content-Type: application/json
{
"grant_type": "refresh_token",
"refresh_token": "YOUR_REFRESH_TOKEN",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
Для отзыва токена (logout):
POST /api/oauth2/v1/revoke
Content-Type: application/json
{
"token": "TOKEN_TO_REVOKE",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
{
"username": "player",
"password": "password123"
}
{
"name": "My App",
"redirectUri": "https://myapp.com/callback",
"description": "Описание приложения",
"userId": "YOUR_USER_ID"
}
Content-Type: multipart/form-data
skin: [PNG файл 64x64 или 64x32]
model: "default" или "slim"
Content-Type: multipart/form-data
cape: [PNG файл 64x32]
const axios = require('axios');
// Получение токена
const tokenResponse = await axios.post(
'https://localhost:3000/api/oauth2/v1/token',
{
grant_type: 'authorization_code',
code: 'AUTHORIZATION_CODE',
redirect_uri: 'https://myapp.com/callback',
client_id: 'YOUR_CLIENT_ID',
client_secret: 'YOUR_CLIENT_SECRET'
}
);
const accessToken = tokenResponse.data.access_token;
// Использование токена
const userInfo = await axios.get(
'https://localhost:3000/api/account/v1/info',
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
console.log(userInfo.data);
import requests
# Получение токена
token_response = requests.post(
'https://localhost:3000/api/oauth2/v1/token',
json={
'grant_type': 'authorization_code',
'code': 'AUTHORIZATION_CODE',
'redirect_uri': 'https://myapp.com/callback',
'client_id': 'YOUR_CLIENT_ID',
'client_secret': 'YOUR_CLIENT_SECRET'
}
)
access_token = token_response.json()['access_token']
# Использование токена
user_info = requests.get(
'https://localhost:3000/api/account/v1/info',
headers={'Authorization': f'Bearer {access_token}'}
)
print(user_info.json())
# Получение токена
curl -X POST https://localhost:3000/api/oauth2/v1/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"code": "AUTHORIZATION_CODE",
"redirect_uri": "https://myapp.com/callback",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}'
# Использование токена
curl https://localhost:3000/api/account/v1/info \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"