使用 aws api 网关的 Wallet Pass 自动更新 Web 服务
Posted
技术标签:
【中文标题】使用 aws api 网关的 Wallet Pass 自动更新 Web 服务【英文标题】:Wallet Pass auto update web service using aws api gateway 【发布时间】:2018-02-09 10:47:46 【问题描述】:我正在开发一项使用 AWS Lambda/API 网关/NodeJS 更新 Apple Wallet 通行证的 Web 服务。 Apple 钱包点击 api 获得更新通过,但每次我收到以下错误:
遇到错误:收到无效的通行证数据(通行证无效,无法读取。)
我已经尝试在浏览器中使用相同的 URL 来获取通行证。通行证每次都在下载,每次都打开一个有效的通行证。但是当 Apple 钱包点击 URL 时它不起作用。我在 Postman 中尝试过相同的 URL,它给了我 base64 而不是二进制数据。
我尝试使用 NodeJS 实现相同的功能并部署在 heroku 上,它可以与 Wallet 正常工作(也在 Postman 中提供二进制文件)。但我需要使用 AWS Lambda/API 网关/NodeJS。
我不确定 AWS 在交付二进制数据时是否会改变某些内容。
对此的任何帮助表示赞赏。
【问题讨论】:
您在 iPhone 的控制台日志中还看到了什么?您的 lambda 应用中是否安装了 WWDR 开发者证书? 这里是整个日志: "logs": [ "[2017-08-31 12:43:04 +0530] 获取传球任务(传球类型pass.com.xxx.xxx.xxx , 序列号 xxxxxxxxxx, if-modified-since (null); with web service url xxxxxxxx.execute-api.us-east-2.amazonaws.com/xxx) 遇到错误: Received invalid pass data (The pass can be read because it is not valid.)" ] WWDR 已安装.当通过 heroku 提供 web 服务时,同样的传递也有效。 您是否正确设置了 content-type 标头? 【参考方案1】:我刚刚经历过这种情况,并花了几个小时试图诊断发生了什么。
对于将 AWS API Gateway 和 Lambda 用于他们的 PassKit Web 服务端点的任何人,API Gateway 的逻辑如何确定它是否需要从 base64 转换响应存在一个主要的“陷阱”(至少截至我的回复之日) ==> 二进制。
如果您检查来自 Apple Wallet / PassKit 的请求标头,您会看到 Accept
标头是 */*
。
API Gateway 显然会遍历请求 Accept
标头中的项目,并确定是否与您在 Your API Name > 下定义的任何 Binary Media Types 匹配设置。它将使用找到的第一个匹配项,然后如您所愿,将 base64 字符串(来自 Lambda)转换为二进制。
这是疯狂的部分 - 如果您将 application/vnd.apple.pkpass
定义为“请转换为二进制”媒体类型之一,来自 Apple Wallet / PassKit 的请求将不起作用。为什么?好吧,AWS(无论出于何种原因......)尚未对 */*
进行编程以匹配 any 类型......它只会匹配*/*
。
因此,Accept
标头的 */*
将不与 application/vnd.apple.pkpass
匹配,并且您的 base64 编码的 .pkpass 响应(来自 Lambda)将不会转换为二进制,从而导致 PassKit扼杀+报告错误。
TL;DR——AWS API Gateway 存在一些问题。要成功返回 PassKit 传递数据,您需要在 Your API Name > Settings > Binary Media Types 下添加 */*
(不是 application/vnd.apple.pkpass
)。
【讨论】:
以上是关于使用 aws api 网关的 Wallet Pass 自动更新 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS CDK 为 AWS API 网关启用 CORS
使用来自 REST 客户端 Postman 的 AWS_IAM 和 API 密钥对 AWS API 网关进行身份验证