Social API
Cung cấp một cách thức để ứng dụng của bạn có thể truy cập dữ liệu trên nền tảng của VNGGames. Thông qua giao thức HTTP ứng dụng có thể truy vấn dữ liệu người dùng, dữ liệu bạn bè, đăng tin mới và nhiều tác vụ khác.
Để sử dụng Social API, bạn vui lòng liên hệ qua email BaoNQ3 để lấy thông tin.
Hệ thống Social API chỉ hoạt động trên giao thức TLS 1.2 trở lên đảm bảo tính an toàn và bảo mật.
Các khái niệm
Social API sử dụng phương thức xác thực OAuth2 để xác thực người dùng với một số định nghĩa cơ bản như sau:
Trong đó:
OAuth Code: Là đoạn mã xác thực phân quyền cho ứng dụng của bên thứ 3 được VNGGames tạo ra sau khi user login và cấp quyền thành công.
Access Token: Là mã chứng nhận để được truy cập các thông tin được bảo vệ. Ứng dụng sẽ sử dụng đoạn mã này để gọi Open API.
Refresh Token: Là mã được dùng để refresh lấy mới Access Token.
Tài liệu API
1. Truy xuất thông tin người dùng
Dùng để truy xuất thông tin cơ bản của người dùng đã cấp quyền cho ứng dụng. Endpoint /me sẽ gửi về thông tin của người dùng ứng với access_token truyền vào.
URL: https://stg-openapi.vnggames.app/personal/v1/me
Method: Get
Response Type: application/json
Ví dụ
curl --location --request GET 'https://stg-openapi.vnggames.app/personal/v1/me?fields=profile.name,profile.avatar' \
--header 'Authorization: Bearer <access_token của bạn>'
2. Tham số header
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
Authorization | String | Yes | Chuỗi Bearer + access_token Xem hướng dẫn lấy access_token ở đây. |
Fields
Tham số | Tính bắt buộc | Kiểu dữ liệu | Giá trị mặc định | Mô tả | Ví dụ |
---|---|---|---|---|---|
fields | No | String | Tất cả thông tin người dùng đã cung cấp | - Sử dụng để lọc các trường thông tin từ kết quả trả về. - Các trường này phải được yêu cầu tường minh khi tạo access_token nếu không server sẽ trả về rỗng - Các trường thông tin được phép truy vấn phân cách nhau bởi dấu phẩy. | profile.userid, profile.avatar |
Để xem các trường thông tin tương ứng của người dùng được phép truy vấn, tham khảo tài liệu Trường thông tin người dùng (scopes)
Kết quả
Các trường thông tin trả về tương ứng với các scope được yêu cầu:
Scope | Trường trả về | Kiểu dữ liệu | Mô tả |
---|---|---|---|
profile.userid | userId | string | UserID trong game |
profile.displayname | displayName | string | Tên hiển thị |
profile.avatar | avatarUrl | string | Đường dẫn ảnh đại diện |
profile.gender | gender | int | Giới tính: - 0: Không xác định - 1: Nam - 2: Nữ |
profile.birthday | birthday | string | Sinh nhật định dạng yyyy-mm-dd |
profile.email | string | Email được khai báo bởi người dùng, email có thể có hoặc chưa được xác thực | |
profile.email | emailVerified | string | Xác định email khai báo bởi người dùng đã được xác thực bởi GG. |
profile.phone | phoneNumber | string | Số điện thoại được khai báo bởi người dùng |
profile.phone | phoneNumberVerified | string | Xác định số điện thoại khai báo bởi người dùng đã được xác thực bởi GG. |
profile.firstname | firstName | string | Tên đệm và tên của người dùng |
profile.lastname | lastName | string | Họ của người dùng |
profile.signinmethod | signInMethod | int | Phương thức mà người dùng sử dụng để đăng nhập vào ứng dụng: - 1: Email - 2: PhoneNumber - 3: Username - 4: Facebook - 5: Google - 6: Apple - 7: Zing - 8: Protected Guest |
profile.firstsignincountry | firstSignInCountry | string | Mã quốc gia mà người dùng đăng nhập lần đầu tiên vào ứng dụng, theo ISO 3166 |
profile.openid | openId | string | VGA OpenID aka ggAlias |
profile.isguest | isGuest | boolean | isGuest: - false: Tài khoản Guest - true: Tài khoản đã protect |
profile.country | countryCode | string | Mã quốc gia của người dùng, theo ISO 3166 |
Nếu request thành công json trả về có định dạng như sau:
{
"status": true,
"error": "success",
"errorDescription": "Success",
"data": {
"displayName": "binhtlt",
"avatarUrl": "",
"gender": 1,
"birthday": "1994-02-11",
"email": "email@gmail.com",
"emailVerified": true,
"phoneNumber": "84987667665",
"phoneNumberVerified": false,
"userId": "130220918182913333",
"firstName": "Binh",
"lastName": "Le",
"signInMethod": 2,
"firstSignInCountry": "VN",
"openId": "36ab1069e9d41a81",
"isGuest": false,
"countryCode": "VN"
}
}
Nếu request thất bại json trả về có định dạng như sau, mã lỗi chi tiết có thể tham khảo bên dưới bảng mã lỗi:
{
"status": false,
"error": "inactive_access_token",
"errorDescription": "Access token is inactive.",
"data": null
}
2. Xoá userId
Dùng để xoá userId
ứng với thông tin từ API /personal/v1/me
trả về.
URL: https://stg-openapi.vnggames.app/personal/v1/delete
Header authorization: Authorization: Basic BASE64(clientId:clientToken)
Method: POST
Response Type: application/json
Ví dụ
curl --location --request POST 'https://stg-openapi.vnggames.app/personal/v1/delete' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'accessToken=UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
Tham số header
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả | Ví dụ |
---|---|---|---|---|
Authorization | String | Yes | Chuỗi `Basic + BASE64(clientId:clientToken) | Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK |
Tham số body
Tham số | Tính bắt buộc | Kiểu dữ liệu | Mô tả | Ví dụ |
---|---|---|---|---|
accessToken | Yes | String | Giá trị của access_token . | UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg= |
Kết quả
Nếu request thành công json trả về có định dạng như sau:
{
"status": true,
"error": "success",
"errorDescription": "Success"
}
Nếu request thất bại json trả về có định dạng như sau, mã lỗi chi tiết có thể tham khảo bên dưới bảng mã lỗi:
{
"status": false,
"error": "inactive_access_token",
"errorDescription": "Access token is inactive."
}
Tài liệu tham khảo
Tạo access token
Để sử dụng hệ thống Social API, ứng dụng của bạn cần được cấp quyền bằng cách lấy mã access token ( mã truy cập) từ User.
Ứng dụng cần thực hiện các bước cấu hình ban đầu để có thể lấy access token. Bạn có thể xem hướng dẫn cấu hình ban đầu bên dưới.
1. Cấu hình thông tin đăng nhập
Để đăng ký ứng dụng, bạn vui lòng liên hệ qua email BaoNQ3
để lấy thông tin clientId
và clientToken
.
2. Tạo code verifier và code challenge
VNGGame sử dụng code challenge và code verifier (theo phương thức PKCE) để tăng độ bảo mật của quá trình xác thực và ủy quyền. Xem thêm về PKCE tại đây.
Sau khi cấu hình Đăng nhập, bạn cần:
Tạo một code verifier và lưu trữ trên hệ thống của bạn.
Dùng mã hóa code verifier bằng bộ ký tự ASCII, tiếp đến dùng giải thuật SHA-256 để tạo mã băm, sau cùng encode Base64 (without Padding) mã băm để tạo ra code challenge từ code verifier.
code_challenge = Base64.encode(SHA-256.hash(ASCII(code_verifier)))
Lưu ý:
Yêu cầu sử dụng code verifier khác nhau cho từng request.
Code verifier là 1 chuỗi bất kỳ, format có đủ chữ hoa, chữ thường và số.
Code verifier là code dùng để xác minh quyền sở hữu của bạn với authorization code bạn nhận được từ hệ thống. Vui lòng không cung cấp code này cho bên thứ ba.
Hãy dùng biến state hoặc một param tự định nghĩa truyền vào
redirect_uri
ở bước Yêu cầu cấp authorization code để xác định authorization code mà bạn nhận được ứng với code verifier nào.
3. Yêu cầu cấp authorization code
Gửi đường dẫn dưới đây đến user để bắt đầu quá trình nhận authorization code. Khi thành công sẽ redirect về ứng dụng hoặc web dựa vào callbackUrl
curl --location --request GET 'https://stg-oauth.vnggames.app/oauth/v1/authorize?client_id=984750101341637590&redirect_uri=https://oidcdebugger.com/debug&scope=profile.name profile.avatar&response_type=code&state=6wvhzv2kwmf2222&code_challenge=LSDF3222&code_challenge_method=S256'
Trong đó: /oauth/v1/authorize
là API Authorization Endpoint với các tham số:
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
client_id | long | yes | ID của partner đăng ký trên portal. |
redirect_uri | string | yes | Thông tin được cấu hình tại bước Cấu hình thông tin đăng nhập. |
response_type | string | yes | Giá trị bắt buộc: Code |
code_challenge | string | yes | Code challenge được tạo từ code verifier với giải thuật SHA-256 tại bước Tạo code verifier và code challenge. |
code_challenge_method | string | yes | Giá trị bắt buộc: S256 |
state | string | yes | Dùng để chống CSRF. Được trả nguyên vẹn trong redirect_uri. |
allowed_auth_method | uint32 | yes | Giá trị bitwise dùng để chỉ định các phương thức đăng nhập được cho phép, với các bit tương ứng cho các phương thức đăng nhập như sau: AppleID: 1 << 0 ZingID: 1 << 1 Google: 1 << 2 Facebook: 1 << 3 Protected Guest: 1 << 4 Disable email: 1 << 5 Disable phone number: 1 << 6 Ví dụ, để hỗ trợ đăng nhập bằng 3 phương thức AppleID, Facebook và Email, giá trị cần truyền sẽ được tính như sau: (1 << 0) \| (1 << 3) \| (1 << 6) = 73 |
scope | string | no | Các trường thông tin người dùng được phép truy vấn, client phải đăng ký trước các quyền muốn truy cập. Các trường default (profile.userid, profile.displayname, profile.avatar) được đăng ký mặc định. Các scope được cách nhau bởi một khoảng trắng. Nếu client không truyền scope thì mặc định sẽ lấy tất cả các trường default. Nếu client truyền một scope chưa được đăng ký trước, server sẽ trả về với mã lỗi invalid_request . |
auth_method | string | no | Dùng khi người dùng muốn đăng nhập hệ thống GG bằng đường social, các giá trị đầu vào là facebook , zing , google , apple , protected_guest . |
source | string | no | Dùng khi người dùng muốn đăng nhập hệ thống GG bằng đường social, các giá trị đầu vào là web-sdk |
lang | string | no | khi người dùng muốn mở trang đăng nhập với ngôn ngữ cụ thể, chi tiết ở Ngôn ngữ |
auth_mode | string | no | Dùng để tuỳ chỉnh cách hiển thị màn hình đăng nhập nếu cần thiết. Với các tuỳ chỉnh như sau: select_account : Hiển thị màn hình chọn tài khoản. |
Đường dẫn sẽ mở trang cấp quyền cho ứng dụng, như sau:
Tại đây, User sẽ chọn “Cho phép” để xác nhận gửi oauth code. Trình duyệt sẽ chuyển hướng và gửi oauth_code về callback URL đã được thiết lập trước đó (callback URL của bạn sẽ nhận được 1 HTTP get request có kèm oauth code).
Ví dụ: callback URL của bạn là https://yourdomain.com/abc. HTTP get request sẽ gọi đến callback URL là:
https://yourdomain.com/abc?code=<AUTHORIZATION_CODE>&state=xxxx
4. Lấy access token từ authorization code
Sử dụng API sau để lấy access token từ authorization code mà bạn nhận được, sau khi lấy token, authorization code sẽ được vô hiệu.
Để đăng ký ứng dụng, bạn vui lòng liên hệ qua email BaoNQ3
để lấy thông tin clientId
và clientToken
.
Tham số header
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả | Ví dụ |
---|---|---|---|---|
Authorization | String | Yes | Chuỗi `Basic + BASE64(clientId:clientToken) | Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK |
Tham số body
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
clientId | string | yes | ID của partner đăng ký trên portal. |
grantType | string | yes | Giá trị bắt buộc: authorization_code |
code | string | yes | Authorization Code được trả về ở bước Yêu cầu cấp authorization code |
redirectUri | string | yes | Redirect URI được truyền vào ở bước Yêu cầu cấp authorization code |
codeVerifier | string | yes | Giá trị được trả về ở bước Yêu cầu cấp authorization code |
Response body
Trong trường hợp success
hệ thống sẽ trả về thêm các thông tin sau:
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
accessToken | string | yes | Access token được ủy quyền để truy xuất thông tin user, token này có thời hạn tương ứng với giá trị expiresIn |
tokenType | string | yes | Giá trị: Bearer |
expiresIn | int | yes | Thời hạn hợp lệ của accessToken. Giá trị hiện tại là 2 giờ. |
refreshToken | string | yes | Refresh token được sử dụng để refresh một access token mới, token này có thời hạn mặc định dài hơn access token. Giá trị hiện tại là 2 tuần. |
scope | string | yes | Scope được user ủy quyền mà client có thể truy xuất |
userId | string | yes | GG ID for game |
Example request:
curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/token' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grantType=authorization_code' \
--data-urlencode 'clientId=984750101341637590' \
--data-urlencode 'code=TUxJYTN4VEJ4bDAxdFc0bzlYUnI0dz09Kzk4NDc1MDEwMTM0MTM3NTkw' \
--data-urlencode 'redirectUri=https://oidcdebugger.com/debug' \
--data-urlencode 'codeVerifier=MLIa3xTBxl01tW4'
Example response:
{
"status": true,
"error": "success",
"errorDescription": "Success",
"accessToken": "c1lUbFVpeEpDTndUTktNeW9RV1lDdz09KzEwMjIwMDE5NjM4MDQyOTUxNjg=",
"tokenType": "Bearer",
"expiresIn": 550698,
"refreshToken": "eXUwRDRVdlk2d0lET253TTYrSFhEZz09KzEwMjIwMDE5NjM4MDQyOTUxNjg=",
"scope": "profile.name,profile.avatar",
"userId": "1088668974395936768"
}
Note: Lấy user access token từ refresh token
Trong trường hợp access token gần hết hạn hoặc bị hết hạn, client có thể dùng refresh token để đi refresh và lấy mới một access token khác. Access token cũ sẽ bị vô hiệu và một access token mới sẽ được trả về.
Trong trường hợp refresh token bị hết hạn, hệ thống sẽ trả về lỗi và client bắt buộc phải hướng dẫn user đi sign-in.
Hệ thống có thể trả về một refresh token mới tương ứng, client cần ghi nhận cả hai thông tin access token và refresh token trả về bởi API này.
Example request:
curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/token' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grantType=refresh_token' \
--data-urlencode 'clientId=984750101341637590' \
--data-urlencode 'refreshToken=eXUwRDRVdlk2d0lET253TTYrSFhEZz09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
Example response:
{
"status": true,
"error": "success",
"errorDescription": "Success",
"accessToken": "UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg=",
"tokenType": "Bearer",
"expiresIn": 550698,
"refreshToken": "yu0D4UvY6wIDOnwM6+HXDg==",
"scope": "profile.name,profile.avatar",
"userId": "1088668974395936768"
}
5. Thu hồi quyền truy cập
Sử dụng API sau để revoke một access_token
được tạo ra bởi hệ thống cho ứng dụng đã đăng ký.
Nếu một user_id
có nhiều hơn một access_token
đã cấp cho ứng dụng và revokeAll=true
thì hệ
thống sẽ revoke tất cả access_token
đã cấp.
Header authorization: Authorization: Basic BASE64(clientId:clientToken)
Example request:
curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/revoke' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'clientId=984750101341637590' \
--data-urlencode 'accessToken=UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
--data-urlencode 'revokeAll=false'
Example response:
{
"status": true,
"error": "success",
"errorDescription": "Success"
}
6. Truy xuất metadata của access token
Sử dụng API sau để truy xuất metadata của access token.
Header authorization: Authorization: Basic BASE64(clientId:clientToken)
Example request:
curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/introspect' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
token | string | yes | Access token. |
Example response:
Nếu request thành công json trả về có định dạng như sau:
{
"status": true,
"error": "success",
"errorDescription": "",
"active": true,
"scope": "profile.ggid,profile.displayname",
"clientId": "984750101341637590",
"userId": "1088668974395936768",
"expiresAt": 1679636512,
"inactiveReason": ""
}
Response data field | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
active | boolean | yes | Access token còn sử dụng được hay không |
inactiveReason | string | no | Lý do token này inactive: - invalid: Token không tồn tại, hoặc đã bị revoke bởi user. - expired: Token bị hết hạn, vui lòng đi refresh. |
expiresAt | long | no | Timestamp in seconds từ 1/1/1970 UTC xác định thời điểm token hết hạn |
scope | string | no | Các trường thông tin người dùng được phép truy vấn |
clientId | string | no | ClientID đăng ký với GG |
userId | string | no | UserId for game |
Nếu request thất bại json trả về có định dạng như sau, mã lỗi chi tiết có thể tham khảo bên dưới bảng mã lỗi:
{
"status": false,
"error": "internal_error",
"errorDescription": ""
}
7. Mã lỗi
Mã lỗi | Mô tả |
---|---|
success | Thành công |
invalid_request | Request thiếu một tham số bắt buộc, hoặc một giá trị tham số không hợp lệ, không đúng định dạng. |
invalid_client | Xác thực ứng dụng không thành công. Ví dụ: Ứng dụng không xác định, chưa đăng ký, hoặc không bao gồm client_token/client_secret trong request, hoặc phương thức xác thực không được hỗ trợ. |
invalid_grant | Mã ủy quyền (authorization_code ) không xác định, hết hạn hoặc có định dạng không hợp lệ. |
invalid_scope | Phạm vi yêu cầu ủy quyền (scope ) không khớp với dịch vụ đã đăng ký. |
unsupported_response_type | Hệ thống không hỗ trợ lấy mã ủy quyền bằng phương pháp được chỉ định. |
unsupported_grant_type | grant_type không hợp lệ hoặc không được hỗ trợ |
unauthorized_client | client_id chưa được đăng ký hoặc client_token/client_secret không hợp lệ |
unauthorized_code | Mã ủy quyền (authorization_code ) không xác định hoặc có định dạng không hợp lệ |
unauthorized_token | Token không xác định hoặc có định dạng không hợp lệ |
expired_access_token | access_token đã hết hạn |
expired_refresh_token | refresh_token đã hết hạn |
inactive_access_token | access_token không hợp lệ |
access_denied | Người dùng đã từ chối quyền truy cập vào ứng dụng. |
server_error | Hệ thống gặp phải lỗi không xác định |
internal_error | Lỗi nội tại của hệ thống |
Ngoài ra, hệ thống có thể trả về tham số errorDescription
với thông tin bổ sung về lỗi.
8. Kiểm tra phiên đăng nhập
Sử dụng API sau để kiểm tra phiên đăng nhập (access token) khi user chơi game
URL: https://[domain]/api/login/checkSession
Method: POST
Content-Type: application/x-www-form-urlencoded
Response type: application/json
Environment | Domain |
---|---|
Production | openapi.vnggames.app |
Staging | stg-openapi.vnggames.app |
Example request:
curl --location 'https://openapi.vnggames.app/api/login/checkSession' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'userID=1095553119777832960' \
--data-urlencode 'sessionID=V2E2bU1XYUY0c25UVG4rQ3EvdmhBcHFYRXJnbW8yZkxLcXlVZGRyMXhnQT1LZFRvVzZCZGVHNkNxUXh1TikyNmRDaGVoanFAQF9tZnRyRk15NlRydEZ2NmljMFoqWEFwOW0yUVBBYUswbnZuZEEkTlBMTzB4QjQ5UUhmcHFlUDIrMTA5NTU1MzEyMTUzMTA1MjAzMg==' \
--data-urlencode 'timestamp=1692608550' \
--data-urlencode 'gameID=984745454866530308' \
--data-urlencode 'sig=2321a0fcbdc0b6aa5648b371ab6f4c6c'
Tham số | Kiểu dữ liệu | Tính bắt buộc | Mô tả |
---|---|---|---|
userID | string | yes | User ID trả về từ SDK |
sessionID | string | yes | access token lấy từ Exchange token |
timestamp | string | yes | Unixtime (second) khi gọi API |
gameID | string | yes | GameID giống với ClientID được sử dụng khi tích hợp SDK |
sig | string | yes | check-sum, tạo bởi công thức md5([secretkey][gameID][userID][timestamp][sessionID]) |
Note:
- Secret key (sử dụng để tạo sig): là client secret bên GG cung cấp khi tích hợp
Example response:
{
"returnCode": 1,
"message": "verify success",
"data": null
}
Tham số | Kiểu dữ liệu | Mô tả |
---|---|---|
returnCode | int | 1: verify success -1: invalidsig -2 : invalid parameter -108: session not exist -404 : api not found -500 : service error |
message | string | Message được trả về |
data | boolean | null |