通过 CloudScript 进行 Webhook 调用

CloudScript 不太为人所知的一个功能是可以使用标准表述性状态转移 (REST) 调用,通过它对任何 Web API 终结点进行 Webhook 调用。

注意

建议尽可能使用较新的 CloudScript Functions 进行 Webhook 调用。

这使游戏可以对基本信息服务进行调用,不过 可实现更复杂的方案(如使用 OAuth)来保护与所拥有的终结点进行的通信。

本教程讨论在非安全安全场景下,如何通过 CloudScript 进行 Webhook 调用。

作为 REST 调用,通过 CloudScript 进行的 Webhook 调用的结构十分简单。 要指定的元素有:

  • URL 终结点。
  • REST 方法(post、get、put 或 delete)。
  • 所需的任何标头。
  • 内容类型(最常用的是应用程序/JSON)。
  • 内容本身(正文)。

例如,用于获取服务器端逻辑版本号的基本 Web API 调用类似于下面的示例。

// CloudScript
var url = "http://api.yoursite.com/playfab_call/GetVersion";
var method = "post";
var contentBody = "";
var contentType = "application/json";
var headers = {};
var responseString =  http.request(url,method,contentBody,contentType,headers);

响应的正文以字符串化形式返回,以便随后在脚本的其余部分中使用。

在此例中,我们查询版本,因此可以将响应写入类似于下面提供的 log

// CloudScript
log.info(responseString);

运行 CloudScript 结束时返回到客户端的响应类似于下面提供的这个示例。

//HTTP Response
{
    "code": 200,
    "status": "OK",
    "data":
    {
        "FunctionName": "MyScript",
        "Revision": 23,
        "FunctionResult": true,
        "Logs": [
        {
            "Level": "Info",
            "Message": "{\"version\": 3}"
        }],
        "ExecutionTimeSeconds": 0.4309841,
        "MemoryConsumedBytes": 29608,
        "APIRequestsIssued": 0,
        "HttpRequestsIssued": 1
    }
}

但是,如果具有需要进行通信的安全服务,则首先需要与该服务交换凭据以建立标识。

对于 OAuth 解决方案,这意味着使用客户端 ID 和密码请求载荷访问令牌。 这会因特定 OAuth 实现而异,但是调用类似于下面的示例。

//CloudScript
var url = "https://api.yoursite.com/playfab_call/request_token";
var method = "post";
var contentBody = "grant_type=client_credentials";
var contentType = "application/x-www-form-urlencoded";
var headers = {};
headers["client_id"] = clientId;
headers["client_secret"] = clientSecret;

var tokenResponse =  http.request(url,method,contentBody,contentType,headers);

在响应正常时,随后 能够类似于下面这样分析响应中的 bearer_access_token(同样,这取决于 OAuth 实现的具体细节,不过这对于这种形式的身份验证是十分常见的模式)。

//CloudScript
var parsedData = JSON.parse(tokenResponse);
var bearer_access_token = parsedData["access_token"];

随后您可以通过提供 bearer_access_token 来调用 OAuth 保护的功能。

//CloudScript
var url = "https://api.yoursite.com/playfab_call/do_action";
var method = "post";
var contentBody = customActionBody;
var contentType = "application/json";
var headers = {};
headers["authorization"] = "Bearer " + bearer_access_token;

因此,本例中的基本模式是使用应用程序的客户端 ID 和密码,以便获取调用的唯一载荷访问令牌,然后使用它保护该调用。

可以看到,这些调用都使用 SSL 进行,以便帮助防止中间人攻击。

通过 CloudScript 使用 HTTP 调用时,可以为游戏调用所需的任何其他 Web API。 这样,您可以将游戏功能扩展到超出 PlayFab 直接提供的范围,从而可以选择创建和使用自己的自定义服务(或访问其他服务)。

因为这一切都发生在 CloudScript 中,所以它提供在其中进行这些调用的服务器权威上下文。 这意味着它们会在 CloudScript 中获得必要保护,以帮助防止玩家作弊或访问不应该访问的功能和数据。