在 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(设备未经授权)

MAUI之Android记录设备号+动态授权

在 React 和 NodeJS 中未经授权重定向之前刷新令牌

解析,保存操作(在设备上)

Android登录后的用户数据如何保存,Android如何保存数据

如何解决 Android ADB 主机设备中未经授权的 ADB 设备?