概述
OneSignal提供了一个名为身份验证的增强安全功能,以帮助防止用户冒充。此功能使用JSON Web Tokens(即JWTs),在您的服务器上安全生成。为了验证订阅信息,这些令牌被传递到您的应用和OneSignal的API。 启用身份验证以保护:- 用户登录
- 添加电子邮件订阅
- 添加短信订阅
- 修改用户身份
先决条件
- 已配置推送平台的现有OneSignal应用。
- 与支持的SDK之一集成的移动应用:
包装 SDK 支持(Flutter、React Native、Unity 等)即将推出。
设置
在后端生成验证JWT
身份验证需要在将终端用户登录到 OneSignal 之前,先使用您的认证服务器对终端用户进行身份验证。当终端用户通过您的后端进行身份验证时,生成令牌并将其包含在对设备的认证响应中。如果您的应用没有运行后端服务器,请考虑设置一个轻量级服务器来验证用户并生成这些令牌。私钥位于我们从控制台下载的上一步文件中。您应该收到如下响应:将 JWT 值粘贴到 jwt.io 并确认解码后的载荷包含以下参数:在进行下一步之前,确认以下内容:
JWT 载荷
JWT 可以具有以下属性:您的 OneSignal 应用 ID
令牌过期日期。
用户的别名。
subscriptions
仅在为用户添加电子邮件和短信订阅时才需要。
JWT 签名
使用 ES256 算法对 JWT 进行签名。确保您的后端配置为使用此签名方法,以避免将 JWT 发送到 OneSignal 时出现验证问题。我们建议使用 JWT 库 来完成此操作。使用 jsonwebtoken 的示例:验证您的 JWT
在与 SDK 集成之前,通过启动服务器并调用端点来验证 JWT 是否正确生成:iss与您在 设置 > 密钥和ID 中的 OneSignal 应用 ID 匹配identity.external_id存在并与您将传递给OneSignal.login()的值匹配exp是未来的时间戳 — 过期的令牌将被 OneSignal 拒绝
包含订阅
理想情况下,在用户登录时,订阅详细信息(如电子邮件或电话号码)应包含在 JWT 载荷中。如果这些详细信息不能预先获得,您的验证服务器必须提供端点以在订阅信息可用时动态生成令牌。示例:生成 JWT 以添加订阅处理 JWT 生命周期事件
您需要在后端实施专用端点来处理令牌失效等场景。当 OneSignal 请求更新时,此端点应提供刷新的 JWT。处理令牌失效和刷新 JWT 的示例:这确保当用户的 JWT 失效时,可以从后端获取新的令牌并传递给 OneSignal。如果在身份验证期间创建的令牌不包含电子邮件和电话号码,您还可以使用此功能生成包含电子邮件和电话号码的令牌,以便管理电子邮件和短信订阅。
添加订阅
您无需额外步骤从移动应用添加订阅;调用登录方法会自动为您处理此操作。- 添加电子邮件
- 添加电话号码
REST API
当启用令牌身份验证时,对以下 API 的所有请求都必须在标头中包含服务器生成的 JWT 作为 bearer 令牌,例如:Authorization: Bearer <JWT>。
- Create user
- View user
- Update user
- Delete user
- View user identity
- Create alias
- Delete alias
- Create subscription
- Update subscription
常见问题
身份验证是必需的吗?
不,但强烈建议使用。没有它,任何知道用户外部 ID 的客户端都可以冒充该用户并修改其订阅或数据。如果 JWT 在会话期间过期会怎样?
SDK 会触发 JWT 失效事件。实现addUserJwtInvalidatedListener(请参阅处理 JWT 生命周期事件)以从后端获取刷新的令牌并将其传递给 updateUserJwt。
哪些 SDK 支持身份验证?
目前,原生 Android SDK(5.2.0+)和 iOS SDK(5.3.0+)。包装 SDK 支持(Flutter、React Native、Unity 等)即将推出。REST API 需要身份验证吗?
当令牌身份验证启用时,对支持的 API 的所有请求必须在Authorization 标头中包含服务器生成的 JWT 作为 bearer 令牌。JWT 的生成方式与 SDK 使用相同。



