我在我的社交应用程序项目中使用了Pubnub库(Pubnub-CodeNameOne-3.7.8.cn1lib)(其中包括我使用您的优秀教程实现的实时聊天:https://www.codenameone.com/blog/building-a-chat-app-with-codename-one-part-5.html)。
但由于Apple将不再接受来自应用程序的http URL连接,因此我不得不加强应用程序的安全性,因此我决定使用HTTPS并激活Pubnub仪表板中的Access Manager功能(我遵循了Pubnub教程{{ 3}})。
所以我改变了CN1项目中Pubnub的实例化,如:
pb = new Pubnub(PUBNUB_PUB_KEY, PUBNUB_SUB_KEY, SECRET_KEY, true);//enable SSL
pb.setAuthKey(USER_UIID);
不幸的是,当我通过Pubnub订阅/发布时,我仍然收到错误:
[错误112-0]:身份验证失败。验证密钥不正确: { “消息”: “禁止”, “有效载荷”:{ “通道”:[ “myChannelID”]} “错误”:真, “服务”:“访问 管理器”, “状态”:403}
因此,我想执行管理PAM功能,例如授予或撤销,以解决上述错误消息问题。 但我没有找到pubnub教程中提到的pubnub.pamGrant()或pubnub.pamRevoke()方法。所以我仍然坚持这个错误。
您对我如何解决这个问题有所了解吗?非常感谢你的帮助。
答案 0 :(得分:0)
虽然您应该使用Access Manager to secure your channels on a per device/user basis,但是不需要Access Manager就可以使用PubNub over TLS(SSL是已弃用/易受攻击的前身,并且这些术语通常可以互换使用)。
因此,在调用PubNub操作时,您的初始化代码是正确的,以启用TLS(https连接)。
pb = new Pubnub(PUBNUB_PUB_KEY, PUBNUB_SUB_KEY, SECRET_KEY, true);
但是如果您在密钥集(发布/订阅键)上启用Access Manager,则需要为auth-keys上的频道授予权限(读取,写入和管理)。每个最终用户都应该拥有一个唯一的身份验证密钥,该密钥具有该用户发布,订阅,获取历史记录,状态等所需的渠道的权限。
您使用发布,订阅和密钥初始化PubNub的grant permissions from your secure server(执行grant
API需要密钥)。使用v4 PubNub SDK,服务器在使用密钥进行访问时具有超级管理员权限。 v3 SDK要求服务器授予自己对自己的身份验证密钥的访问权限,但由于Codename One适用于移动客户端应用程序,因此您无需等待适用于Codename One的v4 PubNub SDK。我假设您将在服务器上使用Java并使用v4 Java SDK v4 has the super admin permissions feature when initialized with the secret key。 注意:文档需要更新,因为他们仍然声明即使使用密钥进行初始化也需要auth-key。
所以我的建议是,启用SSL(TLS),就像您已经为服务器和客户端做的那样,但短期禁用Access Manager。使基本功能正常工作后,将Access Manager和auth-keys的使用集成到服务器和客户端中。