使用 PublicClientApplication、Web 或 SPA 的正确平台是什么?
What is correct platform for using the PublicClientApplication, Web or SPA?
我使用的是 silent-flow 示例,一切正常。但后来我看到我创建了 2 个(Web 和 SPA)平台。所以我决定做一个清理。因为我以为我只是使用 Web
平台,所以我只是删除了 SPA
。但是后来麻烦来了,因为我现在尝试登录时总是出错。
这是我只启用一个平台时的当前状态。
使用SPA
时:
然后我得到
AADSTS9002325: Proof Key for Code Exchange is required for
cross-origin authorization code redemption.
当我使用 Web
:
我得到:
"xxx: The request body
must contain the following parameter: 'client_assertion' or
'client_secret'.\r\nTrace ID:
xxx\r\nCorrelation ID:
xxx\r\nTimestamp: 2021-03-03
09:59:07Z - Correlation ID: xxx -
Trace ID: xxx"
可能我不太明白,但我只需要一个平台,对吗?
我也进行了测试,同时启用了这两个功能,但遇到了与您在上面看到的相同的问题。是不是我的 Azure Portal 有问题?因为除了删除和添加平台之外,我没有更改任何内容。
并且肯定设置 Allow public client flows
设置为 Yes
。
对于桌面应用程序,正确的平台既不是 Web 也不是 SPA,而是**移动和桌面应用程序。
对于设备代码流,您需要设置重定向 URI,并将 允许客户端流设置为是
是的,您是对的,您不需要这两个平台。要选择的 Active Directory 平台取决于您要使用的 OpenID Connect 流程。
Web 平台用于服务器上 运行 的 Web 应用程序。这样服务器就可以安全地存储 long lived secrets/tokens。此场景的常见流程是 Authorization Code。一旦用户登录到应用程序,服务器就会获得授权码并为该特定用户存储它。现在,每次用户请求资源时,服务器都会将授权代码交换为短期令牌并将其用于请求。最后一个请求需要一个预定义的秘密,因为否则每个截获授权代码的人都能够发布令牌。
如果您正在构建服务器端应用程序,您需要向服务器提供一个机密(通常称为客户端机密,因为服务器是身份验证服务器的客户端)。秘密可以在“证书和秘密”部分生成:
您在上面提供的示例似乎是一个服务器端 Web 应用程序(在 node/express 服务器上提供车把模板)。
SPA 平台用于 运行 在 public 客户端(如网络浏览器)上的应用程序。由于我们没有可以维护这些秘密的服务器,我们有两个选择:
后一种是首选,其工作方式与上述一种几乎相同。除了您需要提供客户端生成的机密 (PKCE) 以及刷新令牌以收集访问令牌之外。这个增加的安全层确保拥有刷新令牌的任何其他方都不能发布访问令牌,除非他们也窃取了您的浏览器机密。
如果您要构建 SPA,我希望您选择授权码 + PKCE。错误消息告诉我您将客户端身份验证设置为授权代码,而实际上您需要设置授权代码 + PKCE 流程。您的客户端应用程序必须提供代码质询 (PKCE)。大多数 oidc 库支持开箱即用。
好的,我从 PublicClientApplication
切换到 ConfidentialClientApplication
并将 clientSecret
添加到配置中:
const publicClientConfig = {
auth: {
clientId: "xxx",
authority: "https://login.microsoftonline.com/common",
redirectUri: "http://localhost:3000/redirect",
clientSecret: "xxx"
},
cache: {
cachePlugin
},
};
然后删除了 Azure 中的 SPA
平台并添加了一个新的 Web
平台:
现在可以正常工作了。
所以示例 silent-flow 已经过时了。已经提到了 here.
我使用的是 silent-flow 示例,一切正常。但后来我看到我创建了 2 个(Web 和 SPA)平台。所以我决定做一个清理。因为我以为我只是使用 Web
平台,所以我只是删除了 SPA
。但是后来麻烦来了,因为我现在尝试登录时总是出错。
这是我只启用一个平台时的当前状态。
使用SPA
时:
然后我得到
AADSTS9002325: Proof Key for Code Exchange is required for cross-origin authorization code redemption.
当我使用 Web
:
我得到:
"xxx: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.\r\nTrace ID: xxx\r\nCorrelation ID: xxx\r\nTimestamp: 2021-03-03 09:59:07Z - Correlation ID: xxx - Trace ID: xxx"
可能我不太明白,但我只需要一个平台,对吗?
我也进行了测试,同时启用了这两个功能,但遇到了与您在上面看到的相同的问题。是不是我的 Azure Portal 有问题?因为除了删除和添加平台之外,我没有更改任何内容。
并且肯定设置 Allow public client flows
设置为 Yes
。
对于桌面应用程序,正确的平台既不是 Web 也不是 SPA,而是**移动和桌面应用程序。
对于设备代码流,您需要设置重定向 URI,并将 允许客户端流设置为是
是的,您是对的,您不需要这两个平台。要选择的 Active Directory 平台取决于您要使用的 OpenID Connect 流程。
Web 平台用于服务器上 运行 的 Web 应用程序。这样服务器就可以安全地存储 long lived secrets/tokens。此场景的常见流程是 Authorization Code。一旦用户登录到应用程序,服务器就会获得授权码并为该特定用户存储它。现在,每次用户请求资源时,服务器都会将授权代码交换为短期令牌并将其用于请求。最后一个请求需要一个预定义的秘密,因为否则每个截获授权代码的人都能够发布令牌。
如果您正在构建服务器端应用程序,您需要向服务器提供一个机密(通常称为客户端机密,因为服务器是身份验证服务器的客户端)。秘密可以在“证书和秘密”部分生成:
您在上面提供的示例似乎是一个服务器端 Web 应用程序(在 node/express 服务器上提供车把模板)。
SPA 平台用于 运行 在 public 客户端(如网络浏览器)上的应用程序。由于我们没有可以维护这些秘密的服务器,我们有两个选择:
后一种是首选,其工作方式与上述一种几乎相同。除了您需要提供客户端生成的机密 (PKCE) 以及刷新令牌以收集访问令牌之外。这个增加的安全层确保拥有刷新令牌的任何其他方都不能发布访问令牌,除非他们也窃取了您的浏览器机密。
如果您要构建 SPA,我希望您选择授权码 + PKCE。错误消息告诉我您将客户端身份验证设置为授权代码,而实际上您需要设置授权代码 + PKCE 流程。您的客户端应用程序必须提供代码质询 (PKCE)。大多数 oidc 库支持开箱即用。
好的,我从 PublicClientApplication
切换到 ConfidentialClientApplication
并将 clientSecret
添加到配置中:
const publicClientConfig = {
auth: {
clientId: "xxx",
authority: "https://login.microsoftonline.com/common",
redirectUri: "http://localhost:3000/redirect",
clientSecret: "xxx"
},
cache: {
cachePlugin
},
};
然后删除了 Azure 中的 SPA
平台并添加了一个新的 Web
平台:
现在可以正常工作了。
所以示例 silent-flow 已经过时了。已经提到了 here.