Auth API#
Xác thực người dùng: đăng nhập, đăng ký, quản lý token, mật khẩu, profile.
Base URL: https://apitest.likepion.com/api/v1
POST /auth/login — Đăng nhập #
Request:
{
"email": "user@example.com", // required, email
"password": "secret123" // required, min=8, max=128
}Response (200):
{
"success": true,
"data": {
"access_token": "eyJhbGci...",
"refresh_token": "dGhpcyBp...",
"expires_in": 3600,
"token_type": "Bearer",
"user": {
"id": "uuid",
"email": "user@example.com",
"name": "User Name",
"image": "https://...",
"status": "active",
"role": "user",
"credits": 1000,
"language": "vi",
"country": "VN",
"timezone": "Asia/Ho_Chi_Minh",
"created_at": "2025-01-01T00:00:00Z"
}
}
}Errors: 401 invalid_credentials, 403 account_locked / email_not_verified
POST /auth/register — Đăng ký #
Request:
{
"name": "User Name", // required, min=2, max=100
"email": "user@example.com", // required, email
"password": "secret123", // required, min=8, max=128
"password_confirmation": "secret123" // required, must match password
}Response (201):
{
"success": true,
"data": {"message": "Registration successful, please verify your email"}
}Errors: 409 email_exists
POST /auth/forgot-password #
Request:
{
"email": "user@example.com" // required, email
}Response (200):
{"success": true, "data": {"message": "Password reset email sent"}}POST /auth/reset-password #
Request:
{
"token": "reset-token-string", // required
"new_password": "newpass123" // required, min=8, max=128
}Errors: 400 invalid_token / token_expired
POST /auth/verify-email #
Request:
{
"token": "verify-token-string" // required
}Errors: 400 verify_invalid / verify_expired
POST /auth/resend-verification #
Request:
{
"email": "user@example.com" // required, email
}POST /auth/refresh — Refresh Token #
Request: (hoặc gửi qua cookie)
{
"refresh_token": "dGhpcyBp..."
}Response (200):
{
"success": true,
"data": {
"access_token": "eyJhbGci...",
"expires_in": 3600,
"token_type": "Bearer"
}
}POST /auth/logout #
Request: (hoặc gửi qua cookie)
{
"refresh_token": "dGhpcyBp..."
}GET /auth/me — Thông tin user (JWT) #
Response (200):
{
"success": true,
"data": {
"id": "uuid",
"email": "user@example.com",
"email_verified_at": "2025-01-01T00:00:00Z",
"name": "User Name",
"image": "https://...",
"status": "active",
"role_id": "uuid",
"role": {
"id": "uuid",
"name": "User",
"slug": "user",
"permissions": ["backlink.view", "backlink.create"]
},
"phone": "0901234567",
"language": "vi",
"country": "VN",
"timezone": "Asia/Ho_Chi_Minh",
"credits": 1000,
"credits_used": 500,
"credits_expires_at": "2026-01-01T00:00:00Z",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-06-01T00:00:00Z"
}
}PUT /auth/change-password (JWT) #
Request:
{
"current_password": "oldpass123", // required
"new_password": "newpass123" // required, min=8, max=128
}Errors: 401 password_incorrect
GET /user/profile (JWT) #
Response (200):
{
"success": true,
"data": {
"id": "uuid",
"email": "user@example.com",
"name": "User Name",
"image": "https://...",
"status": "active",
"phone": "0901234567",
"role": "user",
"language": "vi",
"country": "VN",
"timezone": "Asia/Ho_Chi_Minh",
"credits": 1000,
"credits_used": 500,
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-06-01T00:00:00Z"
}
}PUT /user/profile (JWT) #
Request: (tất cả optional)
{
"name": "New Name",
"phone": "0901234567",
"language": "vi",
"country": "VN",
"timezone": "Asia/Ho_Chi_Minh"
}PUT /user/avatar (JWT) #
Request:
{
"image": "https://storage.example.com/avatar.jpg" // required
}DELETE /user/avatar (JWT) #
Xóa avatar, không cần body.
GET /user/dashboard (JWT) #
Response (200):
{
"success": true,
"data": {
"stats": {
"credits": 1000,
"credits_used": 500,
"credits_expires_at": "2026-01-01T00:00:00Z",
"total_orders": 10,
"pending_orders": 1,
"failed_orders": 0
},
"recent_transactions": [
{
"id": "uuid",
"type": "credit",
"credits": 500,
"description": "Package purchase",
"status": "completed",
"created_at": "2025-06-01T00:00:00Z"
}
]
}
}