《统一登录验证》

统一登录验证流程

登陆流程
注:在这个流程中,Access Token 这个字段并不是每个渠道都存在的,并且验证 Token 的方式也不一样。因此在客户端是由 AnySDK 框架持有并使用 Token 字段的,游戏代码无法获取到。如果游戏服务器想实现登录验证之后的安全验证。可以在第八步游戏服务器向游戏客户端返回验证结果数据中 ext 字段加入由游戏服务器生成的 SessionId,客户端就可以在登录成功回调中获取此数据,后面在游戏客户端请求游戏服务器获取数据时需携带此 SessionId 通过游戏服务器的验证。

  1. 游戏客户端调用 AnySDK 框架 login 接口,客户端弹出渠道 SDK 登录界面,相应渠道 SDK 内部向渠道平台服务器发起登录请求
    注:要接到初始化成功的回调,才可以调登录的接口函数
  2. 用户登录成功,渠道SDK获取到渠道平台服务器返回的用户 ID 和授权码
  3. AnySDK 框架从 SDK 获取到 UserId 和授权码,然后向游戏服务器发送请求去做用户登录信息验证(此步请求的接口地址就是开发者填写在打包工具渠道参数上的用户登录验证地址)
    注:以上三步都是由 AnySDK Framework 完成的,不需要开发者再写代码
  4. 游戏服务器接收到客户端请求过来的参数之后,将用户信息等参数再转发给 AnySDK 服务器(此步骤执行的操作在下面有提供 PHP 和 JAVA 语言的 DEMO 代码,开发者可以直接使用或者参考实现)
    (注:此处每个渠道 SDK 登录得到的参数个数与内容都是不同的,因此游戏服务器要遍历接收到的请求中所有参数并全部转发给 AnySDK 服务器,否则无法通过登录验证)
  5. AnySDK 服务器接收到游戏服务器发送过来的请求数据后去向对应的渠道平台服务器进行用户登录验证
  6. AnySDK 服务器接收渠道服务器的验证结果并获得用户最终的 Access Token
  7. AnySDK 服务器将渠道服务器返回的验证结果转发给游戏服务器
  8. 游戏服务器再返回通知 AnySDK 框架登录验证结果,并可以返回一些游戏逻辑相关的数据给游戏客户端
  9. AnySDK 框架执行登录回调函数来通知游戏客户端是否登陆成功

游戏服务器请求登录验证

编码说明

服务端代码字符编码一律要使用 utf-8 without bom ,否则会出现数据编码错误,导致客户端解析数据失败的问题,可以使用 Notepad++ 进行转换

登录验证 URL

http://oauth.anysdk.com/api/User/LoginOauth/    (注意:HTTP 协议 POST 方法)

登录验证步骤

  1. 接收 AnySDK Framework 请求参数(预设 privateKey 及 AnySDK 统一登录验证地址)
  2. 检查 privatekey
  3. 向 AnySDK 登录验证服务发起验证请求
  4. 接收验证结果并游戏逻辑及处理 ext

H5 游戏接入 AnySDK 登录的特殊处理

H5 游戏接入 AnySDK 的时候,游服转发请求时需要往请求参数里面加入 private_key 参数及其参数值。

<?php
define('ANYSDK_PRIVATE_KEY', 'xxxprivate_keyxxx');
...
// 接收请求参数
$params = $_REQUEST;
// 往请求参数增加private_key,这一步要在发起http请求之前
$params['private_key'] = ANYSDK_PRIVATE_KEY;
// 发起http请求
... 

登录验证服务端 Demo

更多服务端 Demo 托管在 GitHub,请前往自取。包括 PHP、Java、Python、NodeJS 等语言。
Sample_Server

AnySDK 登录验证响应数据

AnySDK 统一登录验证获取的数据统一以 json 格式返回,其中包含 statusdatacommonext 四个子域部分

  1. status:用于表达验证请求成功与否
  2. data:保存渠道平台返回的验证信息(此部分数据的格式根据不同渠道的实现不同而有所差异,有些渠道会返回较多的用户信息数据,有些渠道只会返回校验结果,AnySDK 返回这些数据是为了能让游戏服务器获取到所有的原始验证信息,开发者可以使用这些数据,也可以直接忽略掉这部分数据,也不会影响接入)
  3. common:包含渠道编号、渠道 SDK 标识,渠道返回的用户 UserId(渠道唯一),以及用户登录前选择的游戏服务器 ID (此数据只有当客户端调用带 ServerId 的重载登录函数时才会有值,否则默认为空),开发者请使用此部分统一数据作为用户数据。
  4. ext:默认为空,游戏服务器可以在 ext 域中存放游戏逻辑相关的数据(比如开发商服务器内部设定用户标识),这些数据会在游戏客户端获取到登录成功回调时附带的 msg 信息里完整的拿到,然后用来执行相应的游戏逻辑; 成功返回范例(以 360 为例):
{
    "status":"ok",
    "data":
    {
        "id":"18135798",
        "name":"\u6b27\u9ea6\u560e\u5730",
        "avatar":"http:\/\/u1.qhimg.com\/qhimg\/quc\/48_48\/22\/02\/55\/220255dq9816.3eceac.jpg?f=6c449fbaaa093e52b4053e46170af079",
        "sex":"\u672a\u77e5",
        "area":"",
        "nick":""
     },
    "common":
    {
        "channel":"000023",
        "user_sdk":"360",
        "uid":"18135798",
        "server_id":"1",
        "plugin_id":"12"
     },
    "ext":""
}
{
    "status":"fail",
    "data":
    {
        "error":"login_check_fail",
        "error_no":"20002"
    },
    "sn":"error_log_serial_num"
}

失败返回中的 sn 是错误日志序列号,您碰到此类错误的时候,将 sn 的值提供给 AnySDK 技术支持人员,有助于帮你排查问题。

评论区