首页 > 解决方案 > 带有 HERE 插件的 Qt Qml Map 如何正确使用 here.token 进行身份验证

问题描述

我正在努力在 HERE 插件中进行身份验证。我正在使用带有 Qt 5.9.1 Mingw 32bit 的 Windows 10,我的应用程序几乎都是用 C++ 编写的。我使用 QML 的唯一部分是关于地图。我想使用 HERE 插件,但我是 QtLocation 和插件的新手,我真的不明白我需要做什么才能在 HERE 中进行身份验证。我试图按照 HERE 网站上的指南进行操作,但我真的无法理解。

我从 qt 知道我必须用来在 HERE 上进行认证的代码如下:

Plugin {
    name: "here"
    PluginParameter { name: "here.app_id"; value: "myapp" }
    PluginParameter { name: "here.token"; value: "abcdefg12345" }
}

所以我需要here.app_idhere.token

我在 HERE 网站上创建了一个帐户,并使用 REST 创建了一个项目。所以现在我有了我的APP ID参数,但我真的不明白如何将TOKEN值放入第二行。首先,对于我的具体情况,我需要创建一个 api 密钥还是 OAuth 2.0?

我尝试使用 Postman 遵循此链接中所写的内容,最后我得到了一个非常长的令牌,我复制并放入了“here.token”参数,但是当我运行应用程序时,它给了我Invalid here.token和它不显示地图。

有人可以给我有关如何正确获取令牌值的任何提示吗?或者有人可以指点我一些链接吗?是否有其他方法可以使用 api 密钥而不是令牌进行登录?

- - - - - - - - 更新 - - - - - - - - - - - - - - - - - ------

过了一段时间,我不得不回到这个我从未解决过的问题上:现在的情况是我设法通过邮递员获得了令牌,但它总是无效的。现在我正在使用 Qt 5.15.2 和 MinGw 64 位。

我正在使用修改的 minimum_map 示例添加 here.app_id 和 here.token 参数。

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtLocation 5.6
import QtPositioning 5.6

Window {
    width: Qt.platform.os == "android" ? Screen.width : 512
    height: Qt.platform.os == "android" ? Screen.height : 512
    visible: true

    Plugin {
        id: mapPlugin
        name: "here" // "mapboxgl", "esri", ...
        // specify plugin parameters if necessary
        parameters: [
         PluginParameter {
             name: "here.app_id"
             value: "xxxxx"
         },
         PluginParameter {
             name: "here.token"
             value: "yyyyyy"
         }]
    }

    Map {
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14
    }
}

问题是当我运行应用程序时,输出如下:

Invalid here.token
3 ,  "Qt Location requires app_id and token parameters.\nPlease register at https://developer.here.com/ to get your personal application credentials."

为了获得令牌,我做了以下事情:

  1. 我在 developer.here 网站上注册了一个免费增值计划并创建了一个项目。
  2. 我创建了一个 REST API 和一个 OAuth 2.0(JSON Web 令牌),如下所示(我保存了我在 3. 步骤中使用的 credentials.properties 文件): 1.PNG
  3. 我下载了 Postman,创建了一个帐户,然后按照这个问题的答案中的说明进行操作。我收到了这样的 json 格式的响应 3.png
  4. 我进入了我的 minimum_map 示例,并将在我发布的第一张图片中显示的 APP ID 值设置为 app_id(而不是“xxxxx”),并设置为 here.token(而不是“yyyyyy”)在来自邮差。
  5. 我试图清理项目,删除构建文件夹但没有任何改变,答案总是:
Invalid here.token
3 ,  "Qt Location requires app_id and token parameters.\nPlease register at https://developer.here.com/ to get your personal application credentials."

我缺少什么来获得在 Qt 中显示此处插件的令牌?

标签: qtqmlhere-apihere-maps-restqtlocation

解决方案


HERE 服务已更新,但 Qt 尚未更新其插件。

主要变化是:

  • app_id 和 token 仅在使用 HERE SDK 时才需要,在 Qt 的情况下必须使用 apiKey。

  • HERE 服务 url 有以下变化:

  • 使用 https(以前可以通过 http 访问,但现在不行)。

  • 以前的主机有格式X.api.here.com,但现在是X.ls.hereapi.com.

也就是说,您必须从以下位置更改请求:

http://X.api.here.com/?app_code={here.app_code}&app_id={here.app_id}&{other_parameters}

https://X.ls.here.com/?apiKey={here.apiKey}&{other_parameters}

Qt 5.14:

考虑到上述情况,我创建了一个实现上述内容的补丁,因此要使用它,您必须遵循以下过程:

git clone https://code.qt.io/qt/qtlocation.git
cd qtlocation
git checkout 5.14
wget https://raw.githubusercontent.com/eyllanesc/stackoverflow/master/questions/60544057/Qt5.14/update-HERE-Qt5.14.patch
git config --global user.email "you@example.com"
git am < update-HERE-Qt5.14.patch
qmake .
make
make install

Qt 5.9:

考虑到上述情况,我创建了一个实现上述内容的补丁,因此要使用它,您必须遵循以下过程:

git clone https://code.qt.io/qt/qtlocation.git
cd qtlocation
git checkout 5.9
wget https://raw.githubusercontent.com/eyllanesc/stackoverflow/master/questions/60544057/Qt5.9/update-HERE-Qt5.9.patch
git config --global user.email "you@example.com"
git am < update-HERE-Qt5.9.patch
qmake .
make
make install

Window {
    visible: true
    width: 640
    height: 480
    Plugin {
        id: mapPlugin
        name: "here"
        PluginParameter { name: "here.apiKey"; value: "{YOUR_API_KEY}" }
    }
    Map {
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14
    }
}

在此处输入图像描述


更新

这里的服务提供了各种不同的访问 url 的认证系统。因此,考虑到上述情况,我已经尝试了每种情况,我发现 Qt 使用 HERE SDK FOR IO 或 HERE SDK FOR ANDROID(在我回答之前,它用于身份验证类型 REST)。

因此,在这种情况下,您必须激活其中一种类型的身份验证:

在此处输入图像描述

在此处输入图像描述

在 HERE SDK FOR IOS 或 HERE SDK FOR ANDROID 的情况下,您必须分别为包或包名称设置任何值。

因此,here.app_id 必须使用 APP ID,here.token 必须使用 APP CODE:

Plugin {
    id: mapPlugin

    name: "here"
    parameters: [
        PluginParameter {
            name: "here.app_id"
            value: "APP_ID"
        },
        PluginParameter {
            name: "here.token"
            value: "APP_CODE"
        }
    ]
}

推荐阅读