0

I have written a simple Alexa skill which works and I've now added a Widget, these both display as expected.

I am now trying to use the datastore but every time I try to update the store, I am getting an error related to not being able to find the Client ID from the skill metadata.

I am using the ClientID & Client Secret from the Permissions section of the skill in the Alexa Developer Console, using this and the alexa::datastore scope, I am able to authorize and get an access_token.

However, when I the try to call the Data Store REST API to update the datastore, it fails with the following error:

{
  "type": "INVALID_ACCESS_TOKEN",   
  "message": "Unable to find the Client ID from skill metadata:amzn1.application-oa2-client.xxxxxxxxx"
}

I have tried running the Plant Care Widget example skill as it uses the datastore, but that also returns the same error if I look in the CloudWatch Logs.

I have spent a couple of days trying to get this working to no avail.

I am sure my ClientID & Client Secret's are correct, as the authorization works, so it feels like its either some other configuration issue, or a platform issue, or maybe I missed a step that is required?

I also wrote a quick Powershell script to test the API which you can see below:

$clientId = "your-client-id"
$clientSecret = "your-secret"

$body = @{
    grant_type     = "client_credentials"
    client_id      = $clientId
    client_secret  = $clientSecret
    scope          = "alexa::datastore"
}

$tokenResponse = Invoke-RestMethod `
    -Uri "https://api.amazon.com/auth/o2/token" `
    -Method Post `
    -ContentType "application/x-www-form-urlencoded" `
    -Body $body

$tokenResponse | Format-List *

$accessToken = $tokenResponse.access_token
$accessToken 

$headers = @{
    Authorization = "Bearer $accessToken"
    "Content-Type" = "application/json"
    "Charset" = "utf-8"
}

$timestamp = (Get-Date).ToUniversalTime().ToString("o")

$payloadObject = @{
    commands = @(
        @{
            type      = "WRITE"
            namespace = "debug"
            key       = "ping"
            data      = @{ ts = $timestamp }
        }
    )
    target = @{
        type  = "USERS"
        users = @(
            @{ userId = "dummy-user" }
        )
    }
}

$payloadJson = $payloadObject | ConvertTo-Json -Depth 10

$response = Invoke-WebRequest `
    -Uri "https://api.amazonalexa.com/v1/datastore/commands" `
    -Method Post `
    -Headers $headers `
    -Body $payloadJson

$response.StatusCode
$response.Content

Any help you can give will be much appreciated!

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.