使用Kotlin创建AWS SNS推送Platform Endpoint的实现咨询
问题解答
结论先说:创建SNS Platform Endpoint这个操作100%应该放在服务端完成,不要在移动端直接调用SNS接口实现。
为什么不建议移动端直连创建
- 调用SNS的
CreatePlatformEndpoint接口必须持有对应操作权限的AWS访问凭证(AK/SK),如果把凭证硬编码在APK里,只要被反编译拿到,攻击者要么批量刷接口给你造出几十万无效Endpoint产生离谱的AWS账单,要么甚至能给你的全量用户推恶意通知,安全风险根本兜不住。 - 放服务端统一处理的话,你可以顺手做设备注册去重、过期Endpoint自动清理、用户和设备的绑定关系维护,后续要是换推送通道、调整推送逻辑,也不用逼着用户升级APP。
移动端Kotlin侧真正要写的逻辑
你完全不需要在移动端写任何直接操作SNS的代码,只需要拿到FCM生成的设备注册令牌,上报给你自己的业务服务端就行,参考实现:
class MyAppFirebaseMessagingService : FirebaseMessagingService() { override fun onNewToken(fcmToken: String) { super.onNewToken(fcmToken) // 切IO协程把token传给自有服务端 CoroutineScope(Dispatchers.IO).launch { runCatching { // 替换成你自己服务端的上报接口 appApi.uploadPushToken( deviceId = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID), fcmToken = fcmToken ) }.onFailure { // 上报失败就把token存到本地,等下次网络正常再补报 } } } }
服务端对应要做的事
服务端收到移动端传上来的FCM令牌后,先校验下当前请求的用户身份,再调用对应语言的AWS SNS SDK发起CreatePlatformEndpoint请求:传入你提前在SNS控制台建好的PlatformApplication对应的ARN、收到的FCM令牌,还可以在CustomUserData字段存用户ID、设备标识这类自定义信息,创建成功后把返回的EndpointArn和用户、设备的映射关系存在自己的业务库就行,后续发推送直接用这个ARN定向发就可以。
附:移动端Kotlin直连创建Endpoint的调试代码(生产环境绝对禁用)
如果你只是本地调试想快速跑通流程,基于AWS Android SDK直连创建的核心代码如下,再强调一遍:生产环境别这么写,凭证漏了出事没人兜得住:
// 警告:端侧存放AWS凭证有极大安全风险,仅可用于本地调试 val snsClient = AmazonSNSClient(BasicAWSCredentials("你的AWS_ACCESS_KEY", "你的AWS_SECRET_KEY")).apply { setRegion(Region.getRegion(Regions.AP_SOUTHEAST_1)) // 替换成你自己SNS所在的区域 } val createRequest = CreatePlatformEndpointRequest() .withPlatformApplicationArn("你在SNS控制台创建的PlatformApplication ARN") .withToken(fcmToken) .withCustomUserData("自定义用户/设备标记") val result = snsClient.createPlatformEndpoint(createRequest) val endpointArn = result.endpointArn // 拿到生成的Endpoint ARN
内容的提问来源于stack exchange,提问作者meazuri
相关产品推荐
相关产品推荐

