我目前正在构建一项由Azure功能(.NET Core/C#)和Azure AD B2C支持的Alexa技能,用于身份验证。
对于最初的设置,我使用的大多是这个arcticle中的说明。由于这篇文章是几年前写的,我不得不做一些修改。最后,我降落在以下配置上:
Azure Active Directory B2C
正如我提到的,我们正在使用AAD B2C进行身份验证。相关应用程序的用户可以注册并登录React应用程序。其想法是通过Alexa意图+话语为所述用户提供一个替代界面。
我在AAD B2C中创建了一个Alexa应用程序,具有以下设置:
属性
- Web应用程序/Web API:是
- 允许隐式流:是
- 回复URL:我输入了Alexa技能设置提供的值(例如。https://pitangui.amazon.com/api/skil/link/...);有三种不同的。我还为我的azure功能应用程序添加了一个(这可能是不正确的。这是我在诊断其他早期问题时所做的工作的一部分);它的格式是:https://myfuncname.azurewebsites.net/.auth/login/aad/callback(我需要这个吗??)
- 应用程序ID URI:https://myorg.onmicrosoft.com/alexa
- 包括本机客户端:否
按键
我生成了一个应用程序密钥,我将其用作Alexa开发者控制台帐户链接部分的秘密。
许多在线示例都提到在此处设置明确的有效期为1或2年;然而,我根本没有任何选项(即没有到期选项),只有代码。这可能是问题的一部分吗
API访问
- 在已发布的作用域部分中,作用域的名称为
user_impersonation
。描述为"代表登录用户访问此应用程序"。完整范围值为:https://myorgsname.onmicrosoft.com/alexa/user_impersonation.
对于API访问,我必须在此处输入API条目:
- 使用上述
user_impersonation
作用域的一个 - 第二个标题为"访问用户配置文件",使用:
- 为用户获取id_token(openid)
- 为用户获取refresh_token(offline_access)
AAD B2C用户流
我使用的用户流允许注册和登录,它使用以下配置:
属性
其他
- 启用JavaScript强制页面布局(预览):打开
代币寿命
- 访问&ID令牌寿命(分钟):60
- 刷新令牌生存期(天):14
- 刷新令牌滑动窗口生存期:"已绑定">
- 寿命(天):90
代币兼容性设置
- 发行人(iss)索赔:
https://<domain>/<b2c-tenant-guid>
- 主题(子)声明:ObjectID
- 表示用户流的声明:tfp
会话行为
- Web应用程序会话生存期(分钟):1440
- Web应用会话超时:正在滚动
- 单点登录配置:租户
- 注销请求中需要ID令牌:否
Azure功能验证中间件
对于Azure功能中的身份验证层,我正在使用上面提到的文章中描述的方法。
Alexa开发人员控制台
在Alexa方面,我有一个非常简单的技能设置,包括以下设置:
端点
我的端点使用HTTPS选项,默认区域设置为我的Azure Function App的处理程序函数的完全限定HTTPS端点。
证书设置为"我的开发端点是具有通配符的域的子域…">
帐户链接
账户链接设置概述如下:
- 是否允许使用创建帐户或链接到…:切换打开
- 允许用户在不链接帐户的情况下启用技能:打开或关闭
- 允许用户从应用程序或网站中将其帐户链接到您的技能:关闭
- 授权代码:启用
- 授权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
- 你的秘密:在我的Alexa Skill应用程序的AAD B2C应用程序设置中生成的密钥(在上面的AAD B2B设置信息中提到)
- 您的身份验证方案:HTTP Basic
- 作用域:openid和https://myorg.onmicrosoft.com/alexa/user_impersonation
- 域列表:login.microsoftonline.com和myorg.b2clogin.com注意:这可能是错误的,因为我不知道在这里放什么。上面的文章根本没有提到这个设置
- 默认访问令牌到期时间:3600
注意:底部的Alexa重定向URLS是我在AAD B2C中为回复URL部分放入的内容。
问题
现在是最重要的部分,问题。一开始一切似乎都正常。。。我可以访问alexa.amazon.com并使用链接帐户(它将我重定向到我的AAD B2C驱动的登录屏幕)。一旦我链接了账户,我就能成功地利用一句话并收到回复。
当我等了一个小时(我相信是一个小时),问题就开始了。当尝试验证验证令牌时,尝试在一小时后启动Intent会在Azure Function应用程序方面产生错误。
有人能为我提供一些指导吗?我可能设置错误了什么,或者至少应该调查一些事情?正如我在这个问题开始时提到的,我在网上找到的许多参考资料都已经过时了,并没有涵盖我应该使用的所有设置。与b2clogin.com相比,他们中的许多人仍在使用microsoftonline.com权限。
乍一看,我认为问题是Alexa技能在一小时后到期后无法刷新其代币。我需要做些什么来确保它正确刷新
我认为我现在有足够的信息来回答我自己的问题。我发现offline_access
作用域对于令牌刷新是必要的。
根据Microsoft,"offline_access作用域允许您的应用程序在较长时间内代表用户访问资源。在同意页面上,此作用域显示为"维护对您授予其访问权限的数据的访问权限"权限。当用户批准offline_access作用域时,您的应用程序可以从Microsoft身份平台令牌终结点接收刷新令牌。刷新令牌是长期存在的。旧的访问令牌过期时,应用程序可以获得新的访问令牌。">.
你可以在这里阅读更多关于它的信息。
为了解决这个问题,我确保这个范围在AAD B2C中可用,并将其添加为Alexa开发者控制台中的引用范围。
感谢您对offline_access的深入了解。花了几个小时才弄清楚如何实现offline_access。有趣的是offline_access仅适用于Azure AD、OAuth 1.0端点,而不适用于2.0。
在尝试2.0时,当Alexa配置中提到多个作用域时,它在帐户链接时不断失败。我试过的范围如下。
- https://samplealexabackendapi/
- https://graph.microsoft.com/offline_access
最后,我使用了OAuth 1.0端点,并使用了https://samplealexabackendapi/.default其考虑注册的应用程序可用的所有作用域。