首页 > 解决方案 > 亚马逊定位服务添加新地理围栏

问题描述

我正在测试新的亚马逊位置地理围栏,我正在尝试使用位置 API 将新的地理围栏添加到创建的集合中。我收到带有“禁止”消息的 403 响应。

一般来说,我认为该错误是权限错误,因此,我将与位置服务和网关 API 相关的所有权限授予我的 IAM。然而,这并没有改变反应。此外,在这个开发者公会中。他们提到 HTTP/1.1,在此作为发送请求的示例:

POST /geofencing/v0/collections/CollectionName/put-geofences HTTP/1.1
Content-type: application/json
{ ** }

那么,这是否意味着使用 HTTP 协议,而不是 HTTPS。我也对此感到困惑?

这是我从我的 Android 应用程序创建请求的代码。

val geofenceCollectionName = "TestGeofence"
val geofenceName = "TestAndroid"
var url: String = "https://%s.geo.%s.amazonaws.com".format("geofencing", "us-east-1")

url += "/geofencing/v0/collections/%s/put-geofences".format(geofenceCollectionName, geofenceName)
Log.i(TAG, "The url $url")

val polygon = mutableListOf<List<Double>>()

for (point in pointsList) {
    val doubleList: List<Double> = mutableListOf(point.longitude, point.latitude)
    polygon.add(doubleList)
}

val entry = Entry(geofenceName, Geometry(mutableListOf(polygon)))
var geofence = Geofence(mutableListOf(entry))

val accesskeyId = getString(R.string.access_key_id)
val accessKey = getString(R.string.accessKey)

Log.i(TAG, "Keys:$accesskeyId,$accessKey")

val region = "us-east-1"
val serviceName = "geo"
val signer = OkHttpAwsV4Signer(region, serviceName)
val dateStamp = DateTimeFormatter
        .ofPattern("yyyyMMdd'T'HHmmss'Z'")
        .withZone(ZoneOffset.UTC)
        .format(Instant.now())

val request = Request.Builder()
        .url(url)
        .addHeader("Method", "POST")
        .addHeader("Content-Type", "application/x-amz-json-1.0")
        .addHeader("x-amz-date", dateStamp)
        .addHeader("Host", "iam.amazonaws.com")
        .post(Gson().toJson(geofence).toRequestBody())
        .build()

val newRequest = signer.sign(request, accesskeyId, accessKey)


Log.i(TAG, newRequest.headers.toString() + newRequest.body.toString())

对于请求参数,我很喜欢本指南。这是请求标头和正文,您可以检查它:

  Method: POST
    Content-Type: application/x-amz-json-1.0
    x-amz-date: 20210323T183557Z
    Host: iam.amazonaws.com
    Authorization: AWS4-HMAC-SHA256 Credential=*********5PNOV6ZABB/20210323/us-east-1/geo/aws4_request, SignedHeaders=content-type;host;method;x-amz-date, Signature=e2aeb3f2650bbf5fdef2b815fe10d6eb42abd01be658b793f9f9f4e3abcfd4be

Also, this is the body of it:
 {"Entries":[{"GeofenceId":"TestAndroid","Geometry":{"Polygon":[[[-63.752788379788406,44.73291195964523],[-63.74916773289442,44.732945542816445],[-63.74743536114693,44.728887554200355],[-63.7557689845562,44.73082785944519],[-63.75456701964139,44.73190350270925],[-63.752788379788406,44.73291195964523]]]}}]}

但是,我得到的响应是 403,带有一条“禁止”消息,它的标题是:

    date: Tue, 23 Mar 2021 18:36:00 GMT
    content-type: application/json
    content-length: 23
    x-amzn-requestid: c6e46d11-9bd5-4a0c-8f65-31b1600cf95e
    x-amzn-errortype: ForbiddenException
    x-amz-apigw-id: cp06pHulIAMFYRA=

标签: androidamazon-web-servicesapikotlin

解决方案


推荐阅读