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;
};

本地测试

本地测试时,用户模块的相关接口只是返回模拟数据。