Skip to content

用戶

用戶模塊提供獲取當前已登錄玩家的信息與 Token的功能,如果遊戲不需要登錄就可體驗所有功能,那麼不需要使用此模塊,否則需要調用此模塊的相關接口實現相應功能。

閱讀JOGOS_SDK 簡介頁面與您的遊戲引擎相關的部分後,可以按如下方式使用相關的功能:

javascript
window.JOGOS_SDK.user;

獲取當前用戶信息

您可以使用以下方法檢索當前玩家的信息:

javascript
try {
  const user = await window.JOGOS_SDK.user.getUser();
  console.log('Get user result', user);
} catch (err) {
  // 處理異常
  console.error(err);
}

當前玩家如果未註冊或未登錄,則系統會自動打開登錄註冊對話框要求用戶註冊或成功登錄後才可繼續遊戲,否則會返回401 未授權,請重新登錄異常。

如果當前玩家的賬號已被凍結或註銷,也會返回相應的異常信息。

成功返回的玩家對象結構如下:

typescript
// 用戶信息
export interface UserInfo {
  // 用戶 Id
  userId: string;
  // 用戶名
  username: string;
  // 頭像 URL
  profilePictureUrl: string;
  // 遊戲 Id
  gameId: number;
}

JOGOS_SDK的用戶名為 6-20 個字符,可以包含字母、數字、句點和下劃線。

注意: 單賬號多角色的遊戲提示信息

JOGOS_SDKUserId 與玩家賬號是一一對應的;如果您的遊戲可創建多個遊戲角色或者有多個服務器切換角色,需要您的服務端處理這種邏輯,以避免玩家多個角色丟失或無法切換。

獲取用戶令牌(由您的遊戲服務端需要接入)

用戶令牌包含當前登錄玩家的相關信息。您應該在需要時將其發送到您的服務器,並在其中驗證/解碼它以提取相關信息,這對於關聯用戶帳戶非常有用。

您可以使用以下方法檢索用戶令牌:

javascript
try {
  const token = await window.JOGOS_SDK.user.getUserToken();
  console.log('Get token result', token);
} catch (err) {
  // 處理異常
  console.error(err);
}

令牌的生存期為 1 小時。我們建議您不要存儲 Token,並始終在需要 Token 時調用此方法。

當前玩家如果未註冊或未登錄,則系統會自動打開登錄註冊對話框要求用戶註冊或成功登錄後才可繼續遊戲,否則會返回401 未授權,請重新登錄異常。

如果當前玩家的賬號已被凍結或註銷,也會返回相應的異常信息。

返回的令牌可以解碼並在 jwt.io 上進行測試。

成功返回的令牌信息包含以下數據:

json
{
  "jti": "1899405772252258304",
  "sub": "{\"profilePictureUrl\":\"a33bf366e34d48e984a094fc923d7b06.png\",\"gameId\":\"1\",\"profileDefaultAvatar\":\"default-avatar.png\",\"userId\":\"88E1B72FED537C6943C85C28F639BE0B\",\"username\":\"55895999999999999999\"}",
  "iss": "com:jogos:sdk",
  "iat": 1741688600,
  "exp": 1745288600
}
不在客戶端上解密令牌
請確保不要在客戶端解密用戶令牌,因為這樣做是不安全的

當您需要使用服務器對請求進行身份驗證時,您應該將令牌發送到您的服務端,然後對令牌進行解碼和驗證,可以使用此用户令牌公钥託管的公有密鑰驗證令牌。我們建議您在每次驗證令牌時都獲取密鑰,因為它可能會更改。

下面是一個使用TypeScript和公鑰進行解碼和驗證令牌的示例:

typescript
import * as jwt from 'jsonwebtoken';

export interface CrazyTokenPayload {
  userId: string;
  username: string;
  gameId: string;
  profilePictureUrl: string;
}

export const decodeUserToken = async (token: string): Promise<CrazyTokenPayload> => {
  const publickKey = `...`; // 從 https://www.jogos.com/sdk/public-key.txt 獲取
  const payload = jwt.verify(token, key, { algorithms: ['RS256'] });

  return payload as CrazyTokenPayload;
};

本地測試

本地測試時,用戶模塊的相關接口只是返回模擬數據。