【问题标题】:Azure AD device flow verification_urlAzure AD 设备流验证_url
【发布时间】:2024-05-17 23:05:02
【问题描述】:

考虑这个 Azure AD OAuth 2.0 设备流授权请求:

POST https://login.microsoftonline.com/common/oauth2/devicecode
Content-Type: application/x-www-form-urlencoded

client_id=12345678-1234-1234-1234-123456789012
&grant_type=device_code
&resource=https://graph.microsoft.com

(为了便于阅读,跳过了 urlencoding)

根据this draft,响应应该包含verification_uri参数:

verification_uri

必填。授权服务器上的最终用户验证 URI。 URI 应该简短易记,因为最终用户将被要求手动将其输入到他们的用户代理中。

{
   "device_code": "GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
   "user_code": "WDJB-MJHT",
   "verification_uri": "https://www.example.com/device",
   ...

但是来自 Azure AD 的响应包含 verification_url 代替(注意url 而不是uri):

"verification_url": "https://aka.ms/devicelogin"

这只是 Azure AD 的设备流实现中的一个错字吗? 我应该将这两种变体都视为有效吗?这是在下一个草案中重命名为verification_url 吗?

还有一个问题,我可以从 Azure AD v2 端点请求设备流授权吗?

令牌端点似乎以/common/oauth2/v2.0/token 存在,但其代码请求对应方返回404/common/oauth2/v2.0/devicecode

有一个/common/oauth2/devicecode,但我以后无法将它与/common/oauth2/v2.0/devicecode 一起使用(立即返回AADSTS70019 验证码已过期。)。

【问题讨论】:

    标签: azure oauth-2.0 azure-active-directory


    【解决方案1】:

    这可能不是错字。 IETF 草案(你提到的)得到了谷歌和微软的支持。但是两家公司都在不考虑这种差异的情况下实施了它,即“verification_uri”与“verification_url”。

    Google 排在第一位。他们几年前就实施了设备流程。我不确定首次发布的确切日期,但它已经在 2012 年可用。他们从一开始就使用“verification_url”! IETF 草案的第一个版本可以追溯到 2015 年,出于某种原因,负责草案的 Google 团队决定使用“verification_uri”,尽管他们自己的实现已经使用“verification_url”多年。他们从来没有改变过草案,也没有改变它们的实施。他们也在文档中使用“verification_url”。

    另一方面,Facebook 使用草稿版本作为字段名称,即“verification_uri”。查看他们的文档(并且实现与文档一致):https://developers.facebook.com/docs/facebook-login/for-devices

    我还没有找到 Microsoft(即 Azure)设备流实现的官方文档,但这里有一些关于此主题的帖子/文章,它们位于 *.microsoft.com 域中:

    后者附带一个GitHub repo:https://github.com/Azure-Samples/active-directory-dotnet-deviceprofile

    这里有一些非 MS 来源:

    实际上,后者(是日语)是我能找到的第一个 Azure 设备流实现的详细示例。 :-) 它也有“verification_url”。

    至于您的“其他问题”(“我可以从 Azure AD v2 端点请求设备流授权吗?”),我不知道。微软的设备流实现甚至还没有得到官方支持(目前还没有得到支持,至少缺乏文档表明这一点),所以它可能会发生变化。

    v2.0 协议页面也没有提及“devicecode”端点。 见:

    所以现在我建议不要在 Azure 的设备流程上构建任何类似生产的东西。

    【讨论】: