使用jwt验证来自ZIS的请求
在本教程中,您将使用JSON Web令牌(JWTs)来验证来自ZIS集成的请求。作为本教程的一部分,您将创建ZIS集成和中间件服务。
您创建的集成将监听创建票务评论事件在Zendesk亚博。当它检测到事件时,集成的ZIS流将包含事件数据的POST请求发送到中间件。
控件中包含一个ZIS JWTX-ZIS-Authorization
头。中间件验证这个JWT以确保请求是合法的。如果是,中间件将请求传递给外部目标。该目标表示一个外部应用程序。
在本教程中,您将使用AWS Lambda函数作为中间件服务。在生产环境中,您可以使用任何可以处理HTTP请求和验证jwt的服务或技术堆栈。
免责声明Ze亚博ndesk提供本文仅用于指导目的。亚博Zendesk不支持第三方服务,比如AWS。
你需要什么?
要完成本教程,您需要以下内容:
熟悉ZIS。在开始之前,完成构建您的第一个ZIS集成教程。
熟悉基本的JWT概念,如签名。有关概述,请参见解析JWT请求篇文章。
已注册的ZIS集成。您可以使用在中创建的集成构建您的第一个ZIS集成或者注册一个新的。要注册新的集成,请参见注册集成名称.
AWS账户。本教程的所有服务都可以在免费层获得。要创建AWS帐户,请参见如何创建和激活新的AWS账户?请参阅AWS文档。
一个免费的外部目标URLRequestBin
创建AWS Lambda函数
首先,创建一个名为“zis_jwt_example”的AWS Lambda函数。该函数将运行Node.js代码并拥有一个函数URL。稍后,您将使用URL从ZIS流调用该函数。
登录您的AWS账户并打开功能Lambda控制台的。
在功能页面,点击创建函数.
在创建函数页,做以下工作:
- 输入一个函数名“zis_jwt_example”
- 选择一个运行时“Node.js 18.x”
- 下高级设置中,选择启用功能URL.下身份验证类型中,选择没有一个.
保持其他设置不变。
点击创建函数.
保存结果函数地址.您将在本教程后面使用此URL。
上传Lambda函数的代码
接下来,创建并上传调用Lambda函数时运行的Node.js代码。您上传的代码必须包含任何依赖项。
在您的计算机上创建一个名为zis_jwt_example.
mkdir zis_example_jwt
在您的shell中,导航到zis_example_jwt目录中。
cd zis_example_jwt
在该目录下,使用以下命令创建一个新的npm包。
NPM init -y
Lambda函数的代码有两个依赖项:jsonwebtoken和axios.您需要将这些软件包安装到zis_jwt_example目录中。
使用npm安装jsonwebtoken包。
安装jsonwebtoken
使用npm安装axios包。
NPM安装axios
创建一个JavaScript文件index.js.
触摸index.js
将以下代码添加到index.js.在代码中,替换为:
- “ZIS_JWT_PUBLIC_KEY”,其中包含您在执行命令时收到的JWT公钥注册了ZIS集成
- 将“EXTERNAL_TARGET_URL”替换为RequestBin端点URL
常量jwt=需要(“jsonwebtoken”);
常量axios=需要(“axios”);
//替换为集成的JWT公钥和RequestBin端点URL
常量jwtPublicKey=“ZIS_JWT_PUBLIC_KEY”;
常量externalTargetURL=“EXTERNAL_TARGET_URL”;
出口.处理程序=(事件,上下文)=>{
//验证JWT
常量令牌=事件.头[“x-zis-authorization”];
常量关键=缓冲.从(jwtPublicKey,“base64”).toString(“utf - 8”);
控制台.日志(`收到令牌:$ {令牌}关键:$ {关键}`);
jwt.验证(令牌,关键,“RS256”,函数(犯错,_){
如果(犯错){
控制台.日志(错误:“,犯错);
常量响应={
statusCode:401,
身体:JSON.stringify(“JWT无效”),
};
返回响应;
}
//解析输入
常量输入=JSON.解析(事件.身体);
控制台.日志(输入:“,输入);
//发送请求到外部目标
如果(输入){
axios
.帖子(externalTargetURL,输入)
.然后((响应)=>{
控制台.日志("请求已发送:"+响应.数据);
上下文.成功("请求已发送:"+响应.数据);
})
.抓((错误)=>{
控制台.错误(“失败:“+错误);
上下文.失败(“失败:“+错误);
});
}
});
};
当一个ZIS流向非zendesk URL发出请求时,ZIS将JWT包含在亚博
X-ZIS-Authorization
请求头。这段代码从报头检索并解码JWT。然后,代码使用集成的JWT公钥验证JWT。如果成功,代码就会将请求的主体发送到RequestBin端点URL。使用以下命令压缩zis_jwt_example目录的内容放入一个ZIP文件。
-r function.zip。
该命令创建一个functions.zip存档于zis_jwt_example目录中。
在Lambda函数的页面上,单击上传的并选择. zip文件.
点击上传.
在zis_jwt_example目录,选择functions.zip在步骤8中创建的文件。
点击保存.
创建集成
接下来,创建一个ZIS集成,该集成在检测到Ticket Comment Created事件时调用Lambda函数URL。
创建一个JSON文件my_zis_bundle.json.
将以下包骨架添加到my_zis_bundle.json:
{
“名称”:“示例ZIS集成与JWT验证”,
“描述”:“添加评论时将帖子发送到AWS Lambda函数”,
“zis_template_version”:“2019-10-14”,
“亚博电脑端资源”:{
“PostToLambda”:{
“_placeholder_”:"ZIS自定义动作定义在这里"
},
“TicketCommentAddedFlow”:{
“_placeholder_”:“ZIS流到这里”
},
“TicketCommentAddedJobSpec”:{
“_placeholder_”:“ZIS的工作说明书在这里”
}
}
}
在接下来的步骤中,您将定义自定义操作、ZIS流和作业规范。
在my_zis_bundle.json,替换
PostToLambda
具有以下自定义操作定义的占位符。在定义中,将“AWS_LAMBDA_FUNCTION_URL”替换为前面创建的Lambda函数URL。“PostToLambda”:{
“类型”:“子::行动::Http”,
“属性”:{
“名称”:“PostToLambda”,
“定义”:{
“方法”:“职位”,
“url”:“AWS_LAMBDA_FUNCTION_URL”,
“requestBody”:{
“ticket_id美元。”:“.ticket_id美元”,
“comment_body美元。”:“.comment_body美元”
}
}
}
},
当调用时,自定义动作将POST请求发送到AWS Lambda函数的API端点。请求正文包含来自Zendesk票证的注释。亚博
取代
TicketCommentAddedFlow
占位符,具有以下ZIS流定义。在定义中,将“INTEGRATION”替换为您的集成键。“TicketCommentAddedFlow”:{
“类型”:“子:流”,
“属性”:{
“名称”:“TicketCommentAddedFlow”,
“定义”:{
“StartAt”:“PostTicketUpdate”,
“州”:{
“PostTicketUpdate”:{
“类型”:“行动”,
“ActionName”:“子:集成:行动:PostToLambda”,
“参数”:{
“ticket_id美元。”:“.input.ticket_event.ticket.id美元”,
“comment_body美元。”:“.input.ticket_event.comment.body美元”
},
“结束”:真正的
}
}
}
}
},
流包含一个Action状态。该状态调用您在前一步中定义的自定义操作。
取代
TicketCommentAddedJobSpec
具有以下职位说明定义的占位符。在定义中,将“INTEGRATION”替换为您的集成键。“TicketCommentAddedJobSpec”:{
“类型”:“子::JobSpec”,
“属性”:{
“名称”:“TicketCommentAddedJobSpec”,
“event_source”:“支持”,
“event_type”:”票。CommentAdded”,
“flow_name”:“子:集成:流:TicketCommentAddedFlow”
}
}
作业规范告诉ZIS在检测到一个表扬创建事件时运行ZIS流。
保存my_zis_bundle.json.文件现在看起来应该是这样的:
{
“名称”:“示例ZIS集成与JWT验证”,
“描述”:“添加评论时将帖子发送到AWS Lambda函数”,
“zis_template_version”:“2019-10-14”,
“亚博电脑端资源”:{
“PostToLambda”:{
“类型”:“子::行动::Http”,
“属性”:{
“名称”:“PostToLambda”,
“定义”:{
“方法”:“职位”,
“url”:“AWS_LAMBDA_FUNCTION_URL”,
“requestBody”:{
“ticket_id美元。”:“.ticket_id美元”,
“comment_body美元。”:“.comment_body美元”
}
}
}
},
“TicketCommentAddedFlow”:{
“类型”:“子:流”,
“属性”:{
“名称”:“TicketCommentAddedFlow”,
“定义”:{
“StartAt”:“PostTicketUpdate”,
“州”:{
“PostTicketUpdate”:{
“类型”:“行动”,
“ActionName”:“子:集成:行动:PostToLambda”,
“参数”:{
“ticket_id美元。”:“.input.ticket_event.ticket.id美元”,
“comment_body美元。”:“.input.ticket_event.comment.body美元”
},
“结束”:真正的
}
}
}
}
},
“TicketCommentAddedJobSpec”:{
“类型”:“子::JobSpec”,
“属性”:{
“名称”:“TicketCommentAddedJobSpec”,
“event_source”:“支持”,
“event_type”:”票。CommentAdded”,
“flow_name”:“子:集成:流:TicketCommentAddedFlow”
}
}
}
}
将包上传到ZIS。
curl -X POST https://{subdomain}.亚博zendesk.com/api/services/zis/registry/{integration}/bundles \
-u {email}:{password} \
-H "Content-Type: application/json" \
- d @my_zis_bundle.json
安装作业规范以启用集成。
curl -X POST "https://{subdomain}.亚博zendesk.com/api/services/zis/registry/job_specs/install?job_spec_name=zis:{integration}:job_spec:TicketCommentAddedJobSpec" \
密码- u {email}: {}
测试集成
要测试集成和中间件,请使用以下请求创建带有comment.body
.
curl -X POST https://{subdomain}.亚博zendesk.com/api/v2/tickets.json \
-u {email}:{password} \
-H "Content-Type: application/json" \
- d”{
“票”:{
“主题”:“我的打印机着火了!”
"评论":{
“身体”:“烟很鲜艳。”
}
}
} '
导航到RequestBin指示板。您应该看到一个带有票据id和注释的JSON有效负载。这可能需要几分钟。
恭喜你!您已经使用jwt来验证来自ZIS集成的请求。有关ZIS集成的另一个示例,请参阅亚博Zendesk应用程序作为管理界面教程系列。