带有 Azure AD B2C Auth 的 Alexa Skill 在一小时后过期
Alexa Skill with Azure AD B2C Auth expires after an hour
我目前正在构建由 Azure Functions (.NET Core/C#) 和 Azure AD B2C 支持的 Alexa 技能以进行身份验证。
对于初始设置,我主要使用 this arcticle 中的说明。因为这篇文章是几年前写的,所以我不得不做一些修改。最后,我登陆了以下配置:
Azure Active Directory B2C
正如我提到的,我们正在使用 AAD B2C 进行身份验证。相关应用程序的用户能够 sign-up 和 sign-in 到 React 应用程序。这个想法是通过 Alexa intents + utterances 为所述用户提供替代界面。
我使用以下设置在 AAD B2C 中为 Alexa 创建了一个应用程序:
属性
- Web 应用程序/Web API:是
- 允许隐式流:是
- 回复URLs:我输入了Alexa技能设置提供的值(例如https://pitangui.amazon.com/api/skil/link/...); there are three different ones. I also added one for my azure function app (this is something that could be incorrect. It was part of what I did while diagnosing other earlier problems); it's in the format: https://myfuncname.azurewebsites.net/.auth/login/aad/callback(我需要这个吗???)
- 应用 ID URI:https://myorg.onmicrosoft.com/alexa
- 包括本机客户端:否
键
我生成了一个 App Key,我将其用作 Account Linking 部分中的 Secret在 Alexa 开发者控制台中。
许多在线示例都提到在此处设置明确的到期日期为 1 年或 2 年;但是,我根本没有看到任何选项(即没有过期选项),只有代码。这可能是问题的一部分吗???
API访问
- 在 发布的范围 部分,范围的名称是
user_impersonation
。描述是"Access this app on behalf of the signed-in user"。完整范围值为:https://myorgsname.onmicrosoft.com/alexa/user_impersonation.
为了 API 访问,我必须在此处 API 条目:
- 使用上述
user_impersonation
范围的一个。
- 第二个标题为 "Access the user's profile",使用:
- 为用户(openid)获取一个id_token
- 为用户(offline_access)获取refresh_token
AAD B2C 用户流程
我使用的用户流程允许注册和登录,它使用以下配置:
属性
杂项
- 启用JavaScript强制页面布局(预览):开启
令牌生命周期
- 访问和 ID 令牌生命周期(分钟):60
- 刷新令牌生命周期(天):14
- 刷新令牌滑动window生命周期:"Bounded".
- 寿命长度(天):90
令牌兼容性设置
- 发行人 (iss) 声明:
https://<domain>/<b2c-tenant-guid>
- 主题(子)声明:ObjectID
- 表示用户流量的声明:tfp
Session 行为
- Web 应用程序 session 生命周期(分钟):1440
- Web 应用程序 session 超时:滚动
- 单一sign-on配置:租户
- 在注销请求中需要 ID 令牌:否
Azure 函数身份验证中间件
对于 Azure Functions 中的身份验证层,我使用了 the article mentioned above 中描述的方法。
Alexa 开发者控制台
在 Alexa 方面,我有一个非常简单的技能设置,设置如下:
端点
我的端点使用 HTTPS 选项,默认区域设置为我的 Azure Function App 处理函数的 fully-qualified HTTPS 端点。
证书设置为"My development endpoint is a sub-domain of a domain that has a wildcard ..."
帐户 Linking
帐户 linking 设置如下所示:
- 是否允许用户创建帐户或link ...:已启用
- 允许用户在没有帐户的情况下启用技能linking:已启用
- 允许用户从您的应用程序或网站中link他们的帐户到您的技能:已关闭
- 授权码授予:开启
- 授权 URI:
https://myorg.b2clogin.com/myorg.onmicrosoft.com/oauth2/v2.0/authorize?p=<sign-in-user-flow-policy-name>
- 访问令牌 URI:
https://myorg.b2clogin.com/myorg.onmicrosoft.com/oauth2/v2.0/token?p=<sign-in-user-flow-policy-name>
- 您的客户端 ID:AAD B2C 应用程序 GUID
- 你的秘密:在 AAD B2C 的应用程序设置中为我的 Alexa Skill 应用程序生成的密钥(在上面的 AAD B2C 设置信息中提到)。
- 您的身份验证方案:HTTP 基本
- 范围:openid 和 https://myorg.onmicrosoft.com/alexa/user_impersonation
- 域列表:login.microsoftonline.com and myorg.b2clogin.com 注意:这可能是错误的,因为我不知道要做什么放在这里。上面的文章根本没有提到这个设置
- 默认访问令牌过期时间:3600
注意:底部的 Alexa Redirect URLS 是我在 AAD B2C 中为 Reply URL 部分添加的内容。
问题
现在是最重要的部分,问题。一开始一切似乎都正常......我可以去 alexa.amazon.com 并利用 Link 帐户 (这将我重定向到我的 AAD B2C-驱动的登录屏幕)。一旦我 link 帐户,我'能够成功地使用话语并收到回复。
当我等一个小时(我相信是一个小时)时,问题就开始了。尝试在一小时后启动 Intent 会在 Azure Function 应用端尝试验证 Auth Token 时产生错误。
任何人都可以就我可能设置不正确的地方或至少我应该调查的一些事情向我提供一些指导吗?正如我在这个问题的开头提到的,我在网上找到的许多参考资料都是 out-of-date 并且没有涵盖我期望使用的所有设置。他们中的许多人仍在使用 microsoftonline.com 权限与 b2clogin.com.
乍一看,我认为问题出在 Alexa 技能在一小时后过期后未能刷新其令牌。我需要做什么来确保它正确刷新?
我认为此时我有足够的信息来继续回答我自己的问题。我发现 offline_access
范围是令牌刷新所必需的。
根据 Microsoft,"The offline_access scope gives your app access to resources on behalf of the user for an extended time. On the consent page, this scope appears as the "保持对您授予其访问权限的数据的访问权限。当用户批准 offline_access 范围时,您的应用程序可以从中接收刷新令牌Microsoft 标识平台令牌端点。刷新令牌是长期存在的。您的应用可以在旧令牌过期时获取新的访问令牌。“。
您可以阅读更多相关信息 here。
为解决该问题,我确保此范围在 AAD B2C 中可用,并将其添加为 Alexa 开发人员控制台中的引用范围。
感谢您提供有关 offline_access 的见解。弄清楚如何实施 offline_access 花了几个小时。有趣的是 offline_access 仅适用于 Azure AD、OAuth 1.0 端点,不适用于 2.0。
在尝试使用 2.0 时,当在 Alexa 配置中提到多个范围时,它在帐户链接时一直失败。我试过的示波器如下。
最后,我最终使用 OAuth 1.0 端点并使用范围 https://samplealexabackendapi/.default,它考虑了已注册应用程序可用的所有范围。
我目前正在构建由 Azure Functions (.NET Core/C#) 和 Azure AD B2C 支持的 Alexa 技能以进行身份验证。
对于初始设置,我主要使用 this arcticle 中的说明。因为这篇文章是几年前写的,所以我不得不做一些修改。最后,我登陆了以下配置:
Azure Active Directory B2C
正如我提到的,我们正在使用 AAD B2C 进行身份验证。相关应用程序的用户能够 sign-up 和 sign-in 到 React 应用程序。这个想法是通过 Alexa intents + utterances 为所述用户提供替代界面。
我使用以下设置在 AAD B2C 中为 Alexa 创建了一个应用程序:
属性
- Web 应用程序/Web API:是
- 允许隐式流:是
- 回复URLs:我输入了Alexa技能设置提供的值(例如https://pitangui.amazon.com/api/skil/link/...); there are three different ones. I also added one for my azure function app (this is something that could be incorrect. It was part of what I did while diagnosing other earlier problems); it's in the format: https://myfuncname.azurewebsites.net/.auth/login/aad/callback(我需要这个吗???)
- 应用 ID URI:https://myorg.onmicrosoft.com/alexa
- 包括本机客户端:否
键
我生成了一个 App Key,我将其用作 Account Linking 部分中的 Secret在 Alexa 开发者控制台中。
许多在线示例都提到在此处设置明确的到期日期为 1 年或 2 年;但是,我根本没有看到任何选项(即没有过期选项),只有代码。这可能是问题的一部分吗???
API访问
- 在 发布的范围 部分,范围的名称是
user_impersonation
。描述是"Access this app on behalf of the signed-in user"。完整范围值为:https://myorgsname.onmicrosoft.com/alexa/user_impersonation.
为了 API 访问,我必须在此处 API 条目:
- 使用上述
user_impersonation
范围的一个。 - 第二个标题为 "Access the user's profile",使用:
- 为用户(openid)获取一个id_token
- 为用户(offline_access)获取refresh_token
AAD B2C 用户流程
我使用的用户流程允许注册和登录,它使用以下配置:
属性
杂项
- 启用JavaScript强制页面布局(预览):开启
令牌生命周期
- 访问和 ID 令牌生命周期(分钟):60
- 刷新令牌生命周期(天):14
- 刷新令牌滑动window生命周期:"Bounded".
- 寿命长度(天):90
令牌兼容性设置
- 发行人 (iss) 声明:
https://<domain>/<b2c-tenant-guid>
- 主题(子)声明:ObjectID
- 表示用户流量的声明:tfp
Session 行为
- Web 应用程序 session 生命周期(分钟):1440
- Web 应用程序 session 超时:滚动
- 单一sign-on配置:租户
- 在注销请求中需要 ID 令牌:否
Azure 函数身份验证中间件
对于 Azure Functions 中的身份验证层,我使用了 the article mentioned above 中描述的方法。
Alexa 开发者控制台
在 Alexa 方面,我有一个非常简单的技能设置,设置如下:
端点
我的端点使用 HTTPS 选项,默认区域设置为我的 Azure Function App 处理函数的 fully-qualified HTTPS 端点。
证书设置为"My development endpoint is a sub-domain of a domain that has a wildcard ..."
帐户 Linking
帐户 linking 设置如下所示:
- 是否允许用户创建帐户或link ...:已启用
- 允许用户在没有帐户的情况下启用技能linking:已启用
- 允许用户从您的应用程序或网站中link他们的帐户到您的技能:已关闭
- 授权码授予:开启
- 授权 URI:
https://myorg.b2clogin.com/myorg.onmicrosoft.com/oauth2/v2.0/authorize?p=<sign-in-user-flow-policy-name>
- 访问令牌 URI:
https://myorg.b2clogin.com/myorg.onmicrosoft.com/oauth2/v2.0/token?p=<sign-in-user-flow-policy-name>
- 您的客户端 ID:AAD B2C 应用程序 GUID
- 你的秘密:在 AAD B2C 的应用程序设置中为我的 Alexa Skill 应用程序生成的密钥(在上面的 AAD B2C 设置信息中提到)。
- 您的身份验证方案:HTTP 基本
- 范围:openid 和 https://myorg.onmicrosoft.com/alexa/user_impersonation
- 域列表:login.microsoftonline.com and myorg.b2clogin.com 注意:这可能是错误的,因为我不知道要做什么放在这里。上面的文章根本没有提到这个设置
- 默认访问令牌过期时间:3600
注意:底部的 Alexa Redirect URLS 是我在 AAD B2C 中为 Reply URL 部分添加的内容。
问题
现在是最重要的部分,问题。一开始一切似乎都正常......我可以去 alexa.amazon.com 并利用 Link 帐户 (这将我重定向到我的 AAD B2C-驱动的登录屏幕)。一旦我 link 帐户,我'能够成功地使用话语并收到回复。
当我等一个小时(我相信是一个小时)时,问题就开始了。尝试在一小时后启动 Intent 会在 Azure Function 应用端尝试验证 Auth Token 时产生错误。
任何人都可以就我可能设置不正确的地方或至少我应该调查的一些事情向我提供一些指导吗?正如我在这个问题的开头提到的,我在网上找到的许多参考资料都是 out-of-date 并且没有涵盖我期望使用的所有设置。他们中的许多人仍在使用 microsoftonline.com 权限与 b2clogin.com.
乍一看,我认为问题出在 Alexa 技能在一小时后过期后未能刷新其令牌。我需要做什么来确保它正确刷新?
我认为此时我有足够的信息来继续回答我自己的问题。我发现 offline_access
范围是令牌刷新所必需的。
根据 Microsoft,"The offline_access scope gives your app access to resources on behalf of the user for an extended time. On the consent page, this scope appears as the "保持对您授予其访问权限的数据的访问权限。当用户批准 offline_access 范围时,您的应用程序可以从中接收刷新令牌Microsoft 标识平台令牌端点。刷新令牌是长期存在的。您的应用可以在旧令牌过期时获取新的访问令牌。“。
您可以阅读更多相关信息 here。
为解决该问题,我确保此范围在 AAD B2C 中可用,并将其添加为 Alexa 开发人员控制台中的引用范围。
感谢您提供有关 offline_access 的见解。弄清楚如何实施 offline_access 花了几个小时。有趣的是 offline_access 仅适用于 Azure AD、OAuth 1.0 端点,不适用于 2.0。
在尝试使用 2.0 时,当在 Alexa 配置中提到多个范围时,它在帐户链接时一直失败。我试过的示波器如下。
最后,我最终使用 OAuth 1.0 端点并使用范围 https://samplealexabackendapi/.default,它考虑了已注册应用程序可用的所有范围。