一、数字签名
1.1、签名策略

爱游戏开放平台的数字签名级别分三种,安全级别由低到高依次为:无签名;基本签名;业务签名。每个接口都会根据数据的安全要求,对数字签名级别进行限制,在服务请求过程中,如果签名的级别与要求的不一致,或者签名信息与请求参数不匹配,则会被认定为非法请求并阻止调用。所以请您在开发过程中,确保每个接口的签名都与接口所要求的级别、算法一致。

1.2、签名算法

1、基本签名

基本签名只对固定的基本参数进行签名,是CP身份的证明。必须进行签名的字段:统一为client_id、sign_method、version、timestamp、client_secret

具体算法如下:
在调用接口时,如果需要使用基本签名,需要在https请求参数中加入如下参数, 且参数名必须保持一致:client_id、sign_method、version、timestamp、sign_sort、signature。

client_id: 应用向开放平台注册时分配的应用编号
sign_method: 数字签名的编码算法,如MD5,HmacSha1,HmacMD5等,SDK1.0版本暂时只支持MD5算法
version: 所使用的SDK版本,目前版本为1.0
timestamp: 请求发起时的时间戳,如:1385345938378
sign_sort:用于指定请求参数在进行数字签名时的排列顺序。把client_id、sign_method、version、timestamp、client_secret的参数名,按照任意顺序排列,然后拼接起来,参数名之间以“&”符号连接。例如:sign_sort=client_id&sign_method&
version×tamp&client_secret
signature:数字签名。计算步骤如下:

  • 1.把client_id、sign_method、version、timestamp、client_secret参数的值,按照sign_sort中指定的顺序排列,并拼接成字符串,参数之间无需分隔符。
  • 采用jdk的类java.security.MessageDigest,对步骤1生成的字符串进行md5计算,生成byte数组。
  • 将步骤2生成的byte数组转换成16进制字符串,此字符串即为数字签名。计算过程中字符集采用utf-8,16进制字符串转换算法必须与爱游戏提供的ByteFormat.java中算法保持一致。

示例:某应用(client=1001;client_secret=a1b2c3),请求某接口
业务参数:token= aaaaaaaa,
签名级别:基本签名

则加入签名信息后最终请求参数如下:
token=aaaaaaaa
client_id=1001
sign_method=MD5
version=1.0
timestamp=1385345938378
sign_sort= client_id&version&sign_method&client_secret×tamp
signature= bytesToHexString (MD5.encode(“10011.0MD5a1b2c31385345938378”))

2、业务签名

业务签名需要对固定的基本参数和接口业务参数进行签名。不仅能验证CP身份,而且能够提高数据安全性,防止在请求过程中业务参数被第三方篡改。所以采用业务签名的接口,会在接口清单中明确约定需要签名的字段。必须进行签名的字段:具体接口指定。

具体算法如下:
在调用接口时,如果需要使用基本签名,需要在https请求参数中加入如下参数, 且参数名必须保持一致:client_id、sign_method、version、timestamp、sign_sort、signature

client_id: 应用向开放平台注册时分配的应用编号
sign_method: 数字签名的编码算法,如MD5,HmacSha1,HmacMD5等,SDK1.0版本暂 时只支持MD5算法
version: 所使用的SDK版本,目前版本为1.0
timestamp: 请求发起时的时间戳,如:1385345938378
sign_sort:用于指定请求参数在进行数字签名时的排列顺序。把接口要求进行签名的参数,按照任意顺序排列,然后拼接起来,参数名之间以“&”符号连接。例如:某接口约定使用业务签名,签名字段为client_id、sign_method、version、timestamp、client_secret、username、password,则可以使sign_sort=password&username&client_secret×tamp&version&
sign_method&client_id
signature:数字签名。计算步骤如下:

  • 所有需要进行签名的参数的值,按照sign_sort中指定的排列,并拼接成字符串,参数之间无需分隔符。
  • 采用jdk的类java.security.MessageDigest,对步骤1生成的字符串进行md5计算,生成byte数组。
  • 将步骤2生成的byte数组转换成16进制字符串,此字符串即为数字签名。计算过程中字符集采用utf-8,16进制字符串转换算法必须与爱游戏提供的ByteFormat.java中算法保持一致。

示例:某应用(client=12;client_secret=cs),请求某接口
业务参数:username=open; password=123; imsi=189;
签名级别:业务签名
签名字段:client_id、sign_method、version、timestamp、client_secret、username、password、imsi

则加入签名信息后最终请求参数如下:
username=open
password=123
imsi=189
client_id=12
sign_method=MD5
version=1.0
timestamp=1385345938378
sign_sort=client_id&sign_method&version×tamp&client_secret&username&password&imsi
signature=bytesToHexString (MD5.encode(“12MD51.01385345938378csopen123189”))

二、登陆流程
2.1登陆流程(图)

登陆流程:

1.用户触发登陆功能

2.判断用户是否满足自动登陆条件,如果不满足,引导用户进入登陆界面。

3.用户身份通过验证后,爱游戏服务端会生成待登陆应用的授权码,并把请求重定向至“CP服务器端授权码兑换授权令牌”接口。(该接口CP服务器端必须实现,并在客户端触发SDK用户登陆功能时作为重定向地址参数传入,详见3.2.2.1)

4.CP服务器端调用爱游戏服务器端“授权码兑换token”接口(详见3.2.1.1)

5.爱游戏服务器端校验授权码通过后,生成授权令牌并返回给CP服务器端。

6.CP服务器端收到令牌后,确认用户信息,并进行自己的业务逻辑(如绑定账号等)。然后把令牌信息返回给爱游戏SDK。

备注:出于安全考虑,CP端的接口建议用https协议。

三、服务端接口API(接口清单)
3.1爱游戏服务器端接口

3.1.1授权码兑换令牌

服务地址:https://open.play.cn /oauth/token
签名级别:2
提交方式:GET/POST

功能说明:获取访令牌
请求参数:

编号参数名必填类型/长度备注
1client_idyesString对应于应用注册时返回的client_id
2client_secretyesString对应于应用注册时返回的client_secret
3codeyesString用户授权凭证
4grant_typeyesString此值固定为authorization_code
5redirect_uriyesString此值仅用来做校验,不做转向,
必须和应用注册时填写的转向URI域名一致
6scopenoString访问请求的作用域
7statenoString维护请求和响应的状态,传入值与返回值保持一致

返回结果:

编号参数名类型/长度备注
1access_tokenString访问令牌
2token_typeString令牌类型,目前只有“Bearer”
3refresh_tokenString刷新令牌
4expires_inString访问令牌过期时间
5re_expires_inString刷新令牌过期时间
6scopeString授权范围
7user_idString爱游戏用户Id

可能的错误码:

错误码错误描述
access_denied请求被拒绝
unsupported_response_type非法的response_type
invalid_scope非法的权限范围
invalid_grant非法的grant_type类型
expired_token令牌过期
insufficient_scope超出授权范围
scope limits不合法授权范围
app status is invalid应用状态不可用
appkey is overdueappkey 超出有效时间
app is overdue应用超出有效时间
authorize_code is overdueauthorize_code超出有效时间
access_token is overdueaccess_token超出有效时间
refresh_token is overduerefresh_token超出有效时间
request method must be get请求方式必须为get
request method must be post请求方式必须为post
client_id is emptyclient_id 为空
response_type is emptyresponse_type 为空
redirect_uri is emptyredirect_uri为空
grant type is emptygrant_type为空
authorize code is empty授权码为空
client_secret is invalidate应用的client_secret无效
app business exception occuredCP私有业务处理异常

结果示例
成功响应:

{
"scope": "all",
"re_expires_in": 15552000,
"user_id": 956877,
"token_type": "Bearer",
"expires_in": 5184000,
"refresh_token": "2c639e8c1cbfeee5fb07e968163d0343",
"access_token": "2cd0a6f9c8ce81ada335f1989413ca08"
}

错误响应:

{
"error_uri":null,
"error":"invalid_request",
"state":null,
"error_description":"Missing grant_type parameter value"
}

3.1.2访问令牌鉴权

服务地址:https://open.play.cn/oauth/token/validator
签名级别:2
提交方式:GET/POST

功能说明:访问令牌鉴权(此接口主要用于鉴定用户身份,当应用客户端需要操作用户针对于应用的数据时,如游戏道具,游戏金币等,应用服务器可以调用此接口鉴定用户身份,从而确定用户是否有权限操作相关数据)
请求参数:

编号参数名必填类型/长度备注
1client_idyesString对应于应用注册时返回的client_id
2access_tokenyesString访问令牌

返回结果:

编号参数名类型备注
1codeString返回码,0表示成功
2textString返回码描述信息
3extString业务数据
4ext->user_idString爱游戏用户编码
5ext->access_tokenString访问令牌
6ext->expires_inString令牌有效时间

可能的错误码:
-5,-260,-261,-262,-263,-264,-265

结果示例
成功响应:

{
"ext": {
"access_tpken": "6e87e2dd56dd92a9e5d0322ec9ecbaca",
"expires_in": 4945807,
"user_id": 317506
},
"text": "success" }

错误响应:

{
"code":-261,
"text":"ErrorCode:-261 / Message:access_Token is invalid",
"ext":null
}
3.2应用服务端接口

3.2.1授权码兑换授权令牌(重要)

服务地址:CP自定义(建议使用https协议)
提交方式:GET/POST

功能说明:授权码兑换应授权令牌(如果您的应用需要进行服务器端对接,此接口必须实现,并在客户端代码调用SDK登陆功能时,作为重定向地址参数传入,不然将无法实现登陆功能)
请求参数:CP自定义,但是必须包含以下参数

编号参数名必填类型/长度备注
1codeyesString用户授权凭码

返回结果:

编号参数名类型备注
1access_tokenString访问令牌
2token_typeString令牌类型
3refresh_tokenString刷新令牌
4expires_inString访问令牌过期时间
5re_expires_inString刷新令牌过期时间
6scopeString授权范围
7user_idString爱游戏用户Id

结果示例
成功响应:

{
"scope": "all",
"re_expires_in": 15552000,
"user_id": 956877,
"token_type": "Bearer",
"expires_in": 5184000,
"refresh_token": "2c639e8c1cbfeee5fb07e968163d0343",
"access_token": "2cd0a6f9c8ce81ada335f1989413ca08"
}

错误响应:

{
"error_code": "-5",
"error_description": "ErrorCode:-5 / Message:authorize_code is invalid"
}

备注:此接口可以在调用“爱游戏授权码兑换令牌接口”后,做一些CP私有业务逻辑(如绑定账号信息等),然后直接把“爱游戏接口的返回结果”返回给SDK,参见demo

三、附录
3.1错误代码
错误代码错误信息
-5请求参数异常
-260oauth 访问令牌accessToken过期
-261oauth 访问令牌accessToken无效
-262oauth 访问令牌accessToken失效
-263应用授权过期
-264应用访问受限
-265应用不存在
3.2签名级别代码
签名级别代码含义
1无签名
2基本签名
3业务签名
努力加载中...