如何在使用客户端凭据授予流程时在 JWT 令牌中附加或包含用户身份(用户名或电子邮件地址)

Posted

技术标签:

【中文标题】如何在使用客户端凭据授予流程时在 JWT 令牌中附加或包含用户身份(用户名或电子邮件地址)【英文标题】:How to attach or include user identity (username or email address) in the JWT token while using Client Credential Grant Flow 【发布时间】:2021-06-29 11:51:20 【问题描述】:

我们正在使用 azure AD。在使用客户端凭据授权流程时,如何将用户的身份(用户名和/或电子邮件地址)附加到使用客户端凭据授权流程生成的 JWT 令牌?

我的 API 将从令牌中提取用户电子邮件地址并使用它。 API 的使用者大多是自动化脚本,几乎不需要用户交互,例如用户必须以交互方式响应在其用户名和密码中键入的身份验证弹出窗口。

我还知道,OAuth 2 资源所有者密码凭据 (ROPC) 授权是一种选择,但不鼓励 Microsoft 文档使用它。

谢谢!

【问题讨论】:

应用程序使用客户端凭据流在没有用户上下文的情况下调用 API。由于不涉及用户,因此令牌中不会有用户声明。 API 应通过在 API 应用注册上定义应用权限(应用角色)来支持仅应用调用者,并允许具有该权限的调用者在请求中定义用户电子邮件,而不是从令牌中获取。如果您想要一个带有用户信息的令牌,则需要使用授权码/设备代码/刷新令牌之类的流程。 如果你能多描述一下这个场景会有所帮助。这些脚本在哪里运行?是否可以由用户完成引导,然后脚本可以使用刷新令牌以该用户身份调用 API? 正如@juunas 所指出的,应用程序使用客户端凭据流在没有用户上下文的情况下调用 API。对于您的场景,如何使用代表流量? docs.microsoft.com/en-us/azure/active-directory/develop/… 没错。客户端凭据授予流程生成应用程序令牌而不是用户令牌。应用程序令牌不包含用户身份。 在这个问题上您还需要帮助吗? 【参考方案1】:

从上面的cmets总结:

应用程序使用客户端凭据流在没有用户上下文的情况下调用 API,因此令牌不包含用户上下文。如果您想要带有用户信息的令牌,我建议您使用授权码流、ROPC 流或任何其他授权流。

【讨论】:

以上是关于如何在使用客户端凭据授予流程时在 JWT 令牌中附加或包含用户身份(用户名或电子邮件地址)的主要内容,如果未能解决你的问题,请参考以下文章

JWT 客户端凭证授予的存储位置

带有刷新令牌的 Keycloak 客户端凭据授予类型

无法通过 Postman 在 Django oauth 工具包客户端凭据授予中获取访问令牌

使用 JWT 获取令牌而不尝试用户凭据 Laravel?

Oauth 刷新令牌授予类型

JWT 令牌是如何认证的?