如何通过在alexa开发者控制台中配置帐户链接部分,在lambda函数中获取google oauth刷新令牌?

如何通过在alexa开发者控制台中配置帐户链接部分,在lambda函数中获取google oauth刷新令牌?,oauth,alexa,alexa-skills-kit,google-tasks,Oauth,Alexa,Alexa Skills Kit,Google Tasks,我已经参考了这个链接,并使用了与上述相同的配置 我能够在lambda函数var accesstoken=handlerInput.requestEnvelope.context.System.user.accesstoken中获取访问令牌 如何通过配置alexa开发者控制台帐户链接部分在handlerinput事件中获取刷新令牌 我曾尝试在companion应用程序中启用/禁用技能,使用模拟器进行测试,从google自动访问中删除alexa skill,然后允许访问 LaunchRequestH

我已经参考了这个链接,并使用了与上述相同的配置

我能够在lambda函数var accesstoken=handlerInput.requestEnvelope.context.System.user.accesstoken中获取访问令牌

如何通过配置alexa开发者控制台帐户链接部分在handlerinput事件中获取刷新令牌

我曾尝试在companion应用程序中启用/禁用技能,使用模拟器进行测试,从google自动访问中删除alexa skill,然后允许访问

LaunchRequestHandler = {
  canHandle(handlerInput) {

    return handlerInput.requestEnvelope.request.type === 'LaunchRequest' || (handlerInput.requestEnvelope.request.type === 'IntentRequest' && handlerInput.requestEnvelope.request.intent.name === 'LaunchRequest');
  },
  async handle(handlerInput) {


    console.log('LAUNCH REQUEST CALLED');
    const speechText = 'Welcome!';
    if (handlerInput.requestEnvelope.context.System.user.accessToken === undefined) {
      console.log('ACCESS TOKEN NOT FOUND IN LAUNCH REQUEST');
      return handlerInput.responseBuilder
        .speak("ACCESS TOKEN NOT FOUND IN LAUNCH REQUEST")
        .reprompt("ACCESS TOKEN NOT FOUND IN LAUNCH REQUEST")
        .withLinkAccountCard()
        .withShouldEndSession(true)
        .getResponse();
    } 



     const fs = require('fs');
    const readline = require('readline');
    const { google } = require('googleapis');


    const SCOPES = ['https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile','https://www.googleapis.com/auth/plus.me','https://www.googleapis.com/auth/tasks.readonly','https://www.googleapis.com/auth/tasks'];

function authorize() {

      return new Promise((resolve) => {
        const client_secret = process.env.client_secret;
        const client_id = process.env.client_id;
        const redirect_uris = ['*******************************', '*******************************', '*******************************'];
        const oAuth2Client = new google.auth.OAuth2(
          client_id, client_secret, redirect_uris[0]);

        console.log('access token found : ' + handlerInput.requestEnvelope.context.System.user.accessToken);

        oAuth2Client.credentials = { "access_token": handlerInput.requestEnvelope.context.System.user.accessToken };

Alexa没有向技能公开刷新令牌,换句话说:您的技能代码无法访问刷新令牌,这完全由Alexa管理。Alexa将在您的客户访问您的技能且访问令牌即将过期时,使用场景背后的刷新令牌向您的身份提供商(在您的情况下为谷歌)请求一个新令牌


Alexa帐户链接文档中对此进行了解释,网址为

。您是否可以添加任何详细信息,如遇到的错误问题,向社区展示您的尝试。感谢您的回复。为了让我的问题更清楚,我想使用google Oauth无缝链接alexa skill,我发现访问令牌在一段时间后过期,用户必须使用amazon companion应用程序重新验证。Oauth有两种类型的流。隐式授权只是发出一个访问令牌。当令牌到期时,用户必须重新验证。通过代码授权流,服务器还发出一个刷新令牌,Alexa将使用该令牌在到期时获取一个新的访问令牌。确保将帐户链接配置为使用代码授予流。你可以按照这里的步骤操作(这个博客使用amazon而不是google登录,但技能配置类似)我还有一个问题。用户通过谷歌登录Alexa后,如何获取用户的电子邮件地址?Alexa请求中提供了IDP生成的访问令牌。您可以从那里读取该令牌,并对其进行解析以查找所附信息,或者致电IDP以获取有关用户身份的更多详细信息