【问题标题】:Alexa, Unable to link your skillAlexa,无法关联您的技能
【发布时间】:2017-07-13 22:25:33
【问题描述】:

我正在使用帐户链接的 Alexa 中创建自定义技能。我使用 OAuth2 php 库创建了自己的身份验证服务器,并在技能配置中配置了授权 url 和令牌 url。

当我尝试从 Alexa 移动应用程序关联帐户时,我收到错误消息“无法关联您的技能”。以下是我的工作进度。

  • Alexa 应用程序能够打开我的身份验证网址。
  • 我能够授权并提供带有重定向 uri 的授权代码。
  • Alexa 正在使用之前提供的授权码请求访问令牌。
  • 我能够验证授权代码并使用访问令牌和刷新令牌返回响应。
  • Alexa 在此步骤中无法与我的技能关联。上面写着“无法关联您的技能”。

我已经浏览了我的论坛,但找不到确切的问题所在。有人可以在这方面帮助我吗?

【问题讨论】:

  • 你有重定向网址的例子吗?特别是查询字符串。
  • layla.amazon.com/api/skill/link/… 。这就是我在授权时重定向的样子
  • 亚马逊针对此类问题的官方文档:forums.developer.amazon.com/articles/38610/…
  • 你能解决这个问题吗?我的自定义技能面临同样的问题。在尝试链接帐户时,它会重定向到无法链接帐户。我正在使用授权代码授权类型并且也更新了客户端密码。任何帮助将不胜感激。

标签: alexa alexa-skills-kit alexa-skill alexa-voice-service


【解决方案1】:

我也遇到了同样的问题,通过为“客户端身份验证方案”选择“请求正文中的凭据”(默认为 Http 基本)解决了问题,因为在我的情况下,访问令牌是在正文中发送的信息。检查您的服务器如何发送身份验证令牌。

【讨论】:

    【解决方案2】:

    如果您的重定向链接当前是:

    https://layla.amazon.com/api/skill/link/xxxxxxxxxxxxxx?code=xxxxxxxxx&state=xxxxx

    您需要将? 更改为#

    例如

    https://layla.amazon.com/api/skill/link/xxxxxxxxxxxxxx#code=xxxxxxxxx&state=xxxxx

    【讨论】:

    • 我正在使用授权码授权类型,在这种方法中如果我改变了?到 # 它会抛出错误消息。每当我使用隐式授权类型时,它对于您提到的内容都可以正常工作。所以目前我使用的是隐式授权类型,但我的要求是使用授权授权类型。
    【解决方案3】:

    认为这可能有助于任何想知道 Alexa 服务如何发布到他们的 OAuth 端点的人,因为它非常不透明且没有记录。重定向到 Alexa 服务会向已定义的 OAuth 端点发起 POST 请求,其中 post body 采用 x-www-form-urlencoded 格式而不是 JSON。所以 POST 看起来像这样。 ​

    POST /authentication/1/oauth HTTP/1.1 url.Values{} grant_type=authorization_code&code=XXXXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=https%253A%252F%252Fpitangui.amazon.com%252Fapi%252Fskill%252Flink%252FM9BEOG3DM65SQ&client_id=XXXXXXXXXXXXXXXXXXXXXX
    

    如果您的端点没有解析此数据或期望某种可以轻松解组的格式,那么它可能会失败并返回 406 响应。

    【讨论】:

      【解决方案4】:

      在我的情况下,问题出在客户端密码上, 在谷歌开发者控制台中添加你的技能重定向 URI 并重新检查您在 Alexa 技能授权授权类型中提供的客户端密码

      【讨论】:

        【解决方案5】:

        我的问题在于最后的 AccessToken 调用。我假设它使用的是 GET 请求,所以我只在我的函数中满足了这一点。它实际上是在创建一个访问令牌。所以它使用的是 POST。

        在我更新我的函数以使用帖子并以 JSON 格式返回 AccessToken 之后,一切正常。

        【讨论】:

          【解决方案6】:

          也许以下步骤可以帮助您识别问题:

          • 将 console.log('LOGS', response) 添加到您的 Lambda 函数。
          • 在 Alexa 应用中激活技能并登录
          • 返回您的 Lambda 函数并检查 LOGS 条目的最新日志。

          如果您发现调用了 Lambda 函数而不是问题不是来自您的 OAuth 服务器,但您可能需要处理您的 Lambda 函数中的“AcceptGrant 指令”,因为它在此处显示:https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-authorization.html#directives

          将您的 Lambda 函数调整为:

          exports.handler = function (request, context) {
          
          if (request.directive.header.namespace === 'Alexa.Authorization' && request.directive.header.name === 'AcceptGrant') {
              log("DEBUG:", "Authorization request",  JSON.stringify(request));
              handleAcceptGrant(request, context);
          }
          
          function handleAcceptGrant(request, context) {
              var response = {
                  event: {
                      header: {
                          "namespace": "Alexa.Authorization",
                          "name": "AcceptGrant.Response",
                          "messageId": request.directive.header.messageId,
                          "payloadVersion": "3"
                      },
                      payload: {}
                  }
              };
              log("DEBUG", "Alexa.Authorization ", JSON.stringify(response));
              context.succeed(response);
          }
          

          如果问题出在 AcceptGrant 上,那么帐号关联现在应该成功了。

          【讨论】:

            猜你喜欢
            • 2017-10-22
            • 1970-01-01
            • 1970-01-01
            • 2021-11-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多