# 服务器鉴权

# 一、接入说明

# 1.1 游戏服务器鉴权

接口名 /auth

请求参数

参数 类型 描述
type int 微信:1/QQ:2/有乐:4
js_code string 自定义登陆态
appid string 游戏id
openid string 用户唯一标识

返回参数

参数 类型 描述
ret int 返回码 0:正确,其他:失败
msg string 返回结果详细说明

请求示例

请求

{
    "type": 1,
    "js_code":"code",
    "appid":"id",
    "openid":"openid"
}
1
2
3
4
5
6

返回

{
    "ret": 0,
    "errmsg": "d"
}
1
2
3
4

# 1.2 游戏自有tconnd服务器鉴权

1.2.1 创建头文件并将如下代码拷贝到该文件中,加入项目中

#ifndef PUB_DEFINE_H_
#define PUB_DEFINE_H_



#include <string.h>
#include <stdint.h>

#define OPEN_ID_LEN 128
#define SESSION_KEY_LEN 128
#define MAX_EXAUTHDATA_LEN 1024


enum AuthDataType {
  TYPE_NULL = 0,
  TYPE_WX = 1,
  TYPE_QQ = 2,
  TYPE_NOAUTH = 3,
  TYPE_YL = 4,
};



struct WXExAuthData {
  char openid[OPEN_ID_LEN];
  char sessionkey[SESSION_KEY_LEN];
  WXExAuthData() {
    memset(openid, 0, OPEN_ID_LEN);
    memset(sessionkey, 0, SESSION_KEY_LEN);
  };
};

struct QQExAuthData {
  char openid[OPEN_ID_LEN];
  char sessionkey[SESSION_KEY_LEN];
  QQExAuthData() {
    memset(openid, 0, OPEN_ID_LEN);
    memset(sessionkey, 0, SESSION_KEY_LEN);
  };
};

struct PCExAuthData {
  char openid[OPEN_ID_LEN];
  PCExAuthData(){};
};

struct YLExAuthData {
  char openid[OPEN_ID_LEN];
  YLExAuthData(){};
};

union AuthData {
  WXExAuthData wx_data;
  PCExAuthData pc_data;
  QQExAuthData qq_data;
  YLExAuthData yl_data;
  AuthData(){};
};

struct ExAuthData {
  int type;                          //AuthDataType 枚举类型
  uint64_t appid;                    //在MOGS平台获得的appid(不接入可以不关心)
  char sigatk[OPEN_ID_LEN];          //自定义登录态客户端存储并在下次登录时与openid一起传入进行鉴权
  uint32_t limit_time;               //有效时长,一个未来时间戳
  uint64_t guid;                     // 接入自有账号体系后返回的唯一id
  AuthData data;
  ExAuthData() {
    type = TYPE_NULL;
    appid = 0;
    memset(sigatk, 0, OPEN_ID_LEN);
    limit_time = 0;
    guid = 0;
  };
};

namespace ExternAuthSpace {
bool DecodeExData(ExAuthData& data, const unsigned char* buff,
                  uint32_t buff_len) {

    if (buff_len > MAX_EXAUTHDATA_LEN || buff_len == 0) {
      return false;
    }
    memcpy(&data, buff, buff_len);
    return true;

  }
}  // namespace ExternAuthSpace

#endif  // PUB_DEFINE_H_
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

1.2.2. 在监听TFRAMEHEAD_CMD_START命令的函数中实现类似如下的解析

TFRAMEAUTHAPS &auth_info =
      frame_head.stCmdData.stStart.stAuthData.stAuthService;
  ExAuthData data;
  if (auth_info.wAuthExDataLen > 0) {
    bool ret = ExternAuthSpace::DecodeExData(data, auth_info.szAuthExData,
                                               auth_info.wAuthExDataLen);
    if (!ret) {
      return -1;
    }
  }
1
2
3
4
5
6
7
8
9
10

1.2.3. 通过解析可以获得ExAuthData的数据并在自己的处理函数中使用数据。(注意:在解析数据之前尽量不要做其他操作,调用tconnd提供的api,如:tconnapi_send(),会造成TFRAMEHEAD被重置而拿不到数据)

1.2.4. 接入配置文件配置引导。

tconnd的配置文件中找到

<AuthInfo>
***********
</AuthInfo>
1
2
3

各项配置,ServiceMode填0,BusinessID填0,ApsSvrCount填1,ApsSvrUrls填 可用服务器列表 (opens new window) 对应的服务器地址

<ApsAuthInfo>
<!--0表示接入 -->
<ServiceMode>0</ServiceMode>
<!--接入业务ID-->
<BusinessID>${BusinessID} </BusinessID>
<ApsSvrCount>1</ApsSvrCount>
<!--接入地址-->
<ApsSvrUrls>9.140.146.47:9611</ApsSvrUrls>
</ApsAuthInfo>
1
2
3
4
5
6
7
8
9

1.2.5. 鉴权连接参数解析

通过下面的SKD的api(getAccount)获得openid和token。

SDK接口 (opens new window)

参数account_value填入openid

account_value填入openid
account_type填入36865(微信),36866(手Q),36867(有乐),36864(无鉴权)
appid填入mogs提供的appid
client_type填入tconnd定义的tagTCONNAPI_CLIENT_TYPE枚举值
1
2
3
4

tagTCONNAPI_CLIENT_TYPE枚举

enum tagTCONNAPI_CLIENT_TYPE 
{
    TCONNAPI_CLIENT_TYPE_PC = 0, 	/* PC客户端 */
    TCONNAPI_CLIENT_TYPE_MOBILE = 1, 	/* 移动终端 */
    TCONNAPI_CLIENT_TYPE_UNKNOWN = 100, 	/* 未知 */
    TCONNAPI_CLIENT_TYPE_ANDROID = 101, 	/* 移动终端android */
    TCONNAPI_CLIENT_TYPE_IOS = 102, 	/* 移动终端ios */
    TCONNAPI_CLIENT_TYPE_MAC = 103, 
    TCONNAPI_CLIENT_TYPE_WINDOWS = 104, 
    TCONNAPI_CLIENT_TYPE_SWITCH = 110, 
    TCONNAPI_CLIENT_TYPE_PS = 120, 
    TCONNAPI_CLIENT_TYPE_XBOX = 130, 
};
1
2
3
4
5
6
7
8
9
10
11
12
13

连接示例

[wss://{自有tconnd地址}?account_value=&account_type=36866&token=d69cafaf9f5a5465712ed18bef2481d0&appid=10000&client_type=102](.)
1

# 二、服务器鉴权时序图

# 2.1 游戏服务器鉴权时序图

服务器鉴权.png

# 2.2 游戏自有tconnd服务器鉴权时序图

自有tconnd服务器鉴权.png