11

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

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

  • Alexa 应用程序能够打开我的身份验证 URL。
  • 我能够授权并使用重定向 uri 提供授权代码。
  • Alexa 正在使用之前提供的授权码请求访问令牌。
  • 我能够使用访问令牌和刷新令牌验证授权代码和响应。
  • Alexa 在此步骤中无法与我的技能关联。它说'无法链接你的技能'。

我已经通过我的论坛大致相同,但找不到究竟是什么问题。任何人都可以在这方面帮助我。

4

6 回答 6

3

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

于 2017-04-30T01:55:28.433 回答
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

于 2017-02-27T11:45:41.553 回答
1

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

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 响应失败。

于 2018-06-21T22:51:22.607 回答
0

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

于 2017-05-31T17:25:31.333 回答
0

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

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

于 2017-07-02T21:10:53.957 回答
0

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

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

如果您发现调用了 Lambda 函数而不是问题不是来自您的 OAuth 服务器,但您可能需要处理 Lambda 函数中的“AcceptGrant 指令”,因为它在此处提出:https ://developer.amazon.com/ zh-CN/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上,那么帐户链接现在应该成功了。

于 2021-01-24T21:15:11.960 回答