在 Android 设备上保存解析安装记录时未经授权
Posted
技术标签:
【中文标题】在 Android 设备上保存解析安装记录时未经授权【英文标题】:Getting unauthorized when saving parse installation record on Android devices 【发布时间】:2017-01-30 02:45:44 【问题描述】:问题已解决
请注意,我在 index.js 中的解析配置不包含 clientKey,但我的应用正在传递 clientKey 的值。
这是 index.js 的更新部分,添加了 clientKey:
var api = new ParseServer(
databaseURI: databaseUri || 'mongodb://mymongodb,
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myappid',
masterKey: process.env.MASTER_KEY || 'mymasterkey',
restAPIKey: process.env.REST_API_KEY || 'myrestapikey',
clientKey: 'myclientkey'
....
我在测试时犯的第二个错误是认为 ios 正在创建新的安装记录 - 我错了,它没有工作......我相信已经测试了升级流程,并且旧 Parse 版本的app 创建了安装记录,从而使新的解析服务器版本能够向 iOS 发送推送。但是,android 无法以这种方式工作,因为安装记录需要 SenderID,因此 Android 的解析服务器版本在升级后无法工作(就像 iOS 一样)。
下面的原始问题
我已按照所有迁移说明从 Parse 切换到 parse-server。 Parse-server 在 iOS 上运行良好。
在 Android 中,我有时在尝试保存解析安装时会获得未授权。我会一直在特定设备上获得未经授权,直到它工作一次。
一旦安装记录保存成功,所有用于保存安装记录的后续调用似乎都有效。
以下是相关的 Android 代码:
String parseAppId = getString(R.string.parse_app_id);
String parseClientKey = getString(R.string.parse_client_key);
String parseServer = getString(R.string.parse_server);
Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId(parseAppId)
.clientKey(parseClientKey)
.server(parseServer)
.build()
);
ParseInstallation parseInstallation = ParseInstallation.getCurrentInstallation();
parseInstallation.saveEventually(new SaveCallback()
@Override
public void done(ParseException e)
// e = com.parse.ParseRequest$ParseRequestException: unauthorized
这是我在 index.js 中的服务器配置(实际值已编辑):
var api = new ParseServer(
databaseURI: databaseUri || 'mongodb://mymongodb,
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myappid',
masterKey: process.env.MASTER_KEY || 'mymasterkey',
restAPIKey: process.env.REST_API_KEY || 'myrestapikey',
serverURL: process.env.SERVER_URL || 'https://my.server.com/parse',
liveQuery:
classNames: ["Posts", "Comments"] // List of classes to support for query subscriptions
,
push:
android:
senderId: 'mysenderid',
apiKey: 'myapikey'
,
ios:
pfx: __dirname + '/certs/myp12file.p12',
bundleId: 'my.bundle.id',
production: true
,
verbose: true
);
我已经验证并重新验证了一百万次 AppId、ClientKey 和服务器设置...它们与我在 index.js 文件中的解析配置中的相同,并且 iOS 和 Android 值是相同(复制和粘贴),除了 Android 在服务器 URL 的末尾有一个额外的斜杠“/”(如设置文档和其他 SO 问题中所述)。
我发现的一个类似问题是:https://github.com/ParsePlatform/parse-server/issues/635
但由于我的 AppId 匹配,这不会导致正在发生的事情。
本站注意到,更新 AppId 时,可能会导致 403 响应,因为 parse 缓存了旧的 AppId 和 ClientKey 值:
http://androidetc.com/android/tutorial_parse_server_android_heroku_mongodb/
但是,客户端密钥和 AppId 与 Parse 保持不变。另外,我现在也可以使用新的模拟器来实现这一点。
我以前也使用“saveInBackground”而不是“saveEventually”,并看到一条说明可能会修复未经授权的错误。
我正在使用当前的 android sdk 进行解析:(来自我的 build.gradle)
compile 'com.parse:parse-android:1.13.1'
我还有两个模拟器,它们能够在使用相同的代码运行时保存解析安装,但如果我尝试使用任何其他值保存,则会失败(我将附加值分离到我正在执行的单独调用中第一次安装保存尝试 - 我想看看如果我尝试使用或不使用附加值进行保存是否有所不同......对于某些设备,它确实如此?):
parseInstallation.put("email", email);
parseInstallation.put("userID", userID);
parseInstallation.put("campusID", campusID);
parseInstallation.put("GCMSenderId", "...senderid...");
(是的,我意识到我应该将这些值存储在另一个表中 - 稍后待定)
... 从最初的帖子中删除了不相关的信息
【问题讨论】:
这个问题是用户特定的还是一般的?就像所有用户都遇到此安装问题一样,还是似乎或多或少是一次性的? android 应用还没有发布,我正好用同一个账号测试。保存parseInstallation的初始调用不包含任何账户信息——只是为设备注册安装记录,我用多台设备测试过。 【参考方案1】:请注意,我在 index.js 中的解析配置不包含 clientKey,但我的应用正在传递 clientKey 的值。
这是 index.js 的更新部分,添加了 clientKey:
var api = new ParseServer(
databaseURI: databaseUri || 'mongodb://mymongodb,
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myappid',
masterKey: process.env.MASTER_KEY || 'mymasterkey',
restAPIKey: process.env.REST_API_KEY || 'myrestapikey',
clientKey: 'myclientkey'
我在测试时犯的第二个错误是认为 iOS 正在创建新的安装记录 - 我错了,它没有工作...我相信已经测试了升级流程iOS 和旧 Parse 版本的应用程序创建了安装记录,从而使新的 parse-server 版本能够向 iOS 发送推送。但是,Android 无法以这种方式工作,因为安装记录需要 SenderID,因此 Android 的解析服务器版本在升级后无法工作(就像 iOS 一样)。
【讨论】:
以上是关于在 Android 设备上保存解析安装记录时未经授权的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio Emulator(设备未经授权)
在 React 和 NodeJS 中未经授权重定向之前刷新令牌