问题标签 [pkce]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
220 浏览

oauth-2.0 - OAuth 2.0 PKCE Flow 不会为伪装/网络钓鱼攻击打开大门吗?

对于已安装应用程序(例如桌面应用程序/cli/客户端库)的 OAuth 2.0 PKCE 流程,似乎没有什么可以阻止攻击者:

  1. 使用原app获取client_id(client_id是公开的,可以方便地从浏览器栏/源代码中复制)
  2. 制作一个模仿原始应用程序的假应用程序
  3. 使用伪造的应用程序诱使用户授予访问权限,从而获得刷新令牌,这实质上意味着在请求的范围内具有完全访问权限

如果没有 PKCE,就很难伪造应用程序并获取刷新令牌,因为这需要攻击者获取client_secret. 在我看来,虽然 PKCE 提供了对隐式流的安全改进,但它使得伪装使用 OAuth 2.0 的真实应用程序变得更加容易?

我正在使用 googlecloudsdk (gcloud),它似乎将client_id(甚至许多client_id/client_secret 对)硬编码到分发给客户端的源代码中。我怀疑有什么可以阻止攻击者伪造 gcloud 从而获得对用户 GCP 环境的访问权限(为了证明,运行gcloud auth login它会在控制台中向您显示攻击者需要的 url。)任何人都可以澄清/帮助我了解发生了什么?

0 投票
1 回答
170 浏览

python - Python 桌面应用程序 - 在 OAuth2 PKCE 流程中关闭浏览器

我已经使用 Python 用 Okta 实现了 OAuth2 PKCE 流。它是一个桌面应用程序。我使用自定义 URL 方案作为重定向 URL 来接收授权代码。一切正常,浏览器在重定向 URL 中看到自定义 URL 方案时打开应用程序,但浏览器保持打开状态并显示正在进行 Okta 登录图像。可以做些什么来关闭浏览器或在浏览器中显示适当的消息?

0 投票
1 回答
381 浏览

authentication - 是否可以使用带有 PKCE 的授权代码流自动登录到 Azure AD B2C

我正在设置一个系统,它使用带有 PKCE 的 OAuth 2.0 授权代码流来连接到 Azure AD B2C,如此所述。

在流程的第一步中,用户https://...b2clogin.com.../authorize?...在将初始令牌发送回查询中定义的重定向 URI 之前调用他们输入凭据的位置。

我想知道是否可以通过这个初始调用发送用户凭据,这样就没有交互步骤——这将允许自动化测试而不求助于浏览器自动化。

0 投票
1 回答
973 浏览

azure-ad-b2c - Azure B2C 中的 KMSI 实际上有什么作用?

我们有这份文档解释了如何使用自定义策略设置保持登录 (KMSI): https ://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-policy-keep -我登录

好的,太好了,所以我们现在知道如何使用(非常复杂的)XML 策略文件来为复选框设置一些 UI。但这实际上在做什么? 这方面的信息在哪里?

  • 它是否在没有重新认证的情况下为客户提供了一个新的 ID 令牌?
  • 它是否提供了新的 auth_code?
  • 它是否使用隐藏的 i-frame?
  • 如何从客户端应用程序实际调用/完成刷新?(温泉)
  • 是否需要往返 B2C 并且它只是不向用户询问信用并将其重定向回应用程序?或者应用程序是否能够使刷新请求完全 UI/UX 静默?如果是这样,怎么做?API 在哪里?是否需要 MSAL.js 中的内容?
  • 为什么只有本地?如果 B2C 是“中间人”IDP,并且它发行的代币是它自己的(当然不是来自社交账户),那么为什么它不能以这种方式为所有账户类型(本地或社交)刷新代币?

我的理解是,对于隐式授予,存储刷新令牌是不可能的,因此保留会话 cookie 并使用它通过 i-frame 获取新会话prompt=none是一个能够保持会话 cookie 更新和最新的 HACK。

这是前 MS(现为 Auth0)身份专家 Vittorio 的文章: https ://auth0.com/blog/oauth2-implicit-grant-and-spa/

他通过Refresh Token Rotation提到了“更新访问令牌” 。这被描述为:

“一种使刷新令牌无效并在用于刷新访问令牌时发出新令牌的功能”

这似乎是通过会话 cookie 和 i-frame “hack”(与 Implicit Grant 一起使用的)完成的,它返回一个新的授权代码,该代码(大概)可用于获取新的访问令牌。

当我们现在有 PKCE 时,为什么需要这样做? 显然,即使使用 PKCE,在浏览器中存储长期存在的刷新令牌仍然很糟糕。我发现未记录的信息表明SPA 的 B2C 刷新令牌最长生命周期为 24 小时(不是 90 天,并且不可配置)。

那么我们今天还在做这个会话 cookie 隐藏 i-frame hack 吗?即使是PKCE?这就是 B2C KMSI 正在做的事情吗?如果是这样,它是如何触发的,我的应用程序实际上如何获得一个新的访问令牌以用于我的 API?

底线:我需要让我的用户保持签名并能够访问我的安全 Web API 而无需重新授权,即使他们 100 多天没有再次打开我的应用程序。理想情况下,这应该完全无声地完成,没有往返,无论帐户是本地帐户还是 IDP 方面的社交帐户。B2C KMSI 功能是否是正确的机制?

0 投票
1 回答
87 浏览

auth0 - 将 Auth0 与 oidc-client 和 PKCE 一起使用

我将Auth0oidc-client (latest 1.10.1)一起使用。

现在我要做的是使用 PKCE 流而不是隐式流,在AuthModule中我有以下oidc配置:

我不得不将response_type值从id_token toke更改为code

我读到的另一件事需要更改的是静态页面:

我知道我需要为Oidc.UserManager config添加response_mode: 'query'

现在一切都很好,但我认为我错过了一些东西,因为我被无限重定向了。

我需要在 Auth0 应用程序中进行一些额外的设置吗?

0 投票
0 回答
196 浏览

oauth-2.0 - How can I implement Dropbox OAuth2 + PKCE flow with Blazor Webassembly?

I am trying to use the Dropbox.Api dotnet SDK, which is built on netstandard 2.0, by translating the example from the docs here into a Blazor Webassembly project. I have narrowed down the issue to the fact that the PKCEOAuthFlow class uses private members CodeVerifier and CodeChallenge to implement the PKCE flow, and these private members are generated and set only in the constructor, which makes sense.

So here is specifically where I am stuck: How can I persist that exact object with its one-time generated CodeVerifier/CodeChallenge which must be the same when I try to call ProcessCodeFlowAsync after the Dropbox redirect back to my app?

I have tried the following:

  1. Opening the dropbox authorize URL in a new tab so that the main tab stays open. This fails because when Dropbox redirects the user back, they stay in the new tab and my object is only still alive back in the first tab.
  2. Making an ILoginService class, injecting it into my pages as a singleton by doing builder.Services.AddSingleton<ILoginService, DropboxLoginService>(); inside Program.cs, but I always get a new one. I am not sure exactly why this fails, but I believe that the entire Webassembly app goes out of scope when I send the user to Dropbox and after the redirect it has to create a new ILoginService anyways.
  3. I also tried making my entire DropboxLoginService class static, with a static PKCEOAuthFlow member set in the static constructor. I also end up with a new object every time when I do it this way, probably for the same reason as #2.
  4. I tried saving my object to the browser session storage using Blazored.SessionStorage, but I quickly realized this does not persist any private members, and the object that I retrieve after the redirect again has a new CodeVerifier and CodeChallenge.
  5. DID NOT TRY THIS YET - I think that MAYBE I could serialize the entire object in some binary format, then save a base64 string to the session storage to retrieve it later. However, this feels like a security hole considering that the whole point of PKCE is to avoid untrustworthy storage with sensitive information. It would basically negate the security since an intrepid hacker could possibly get at that object and MITM my user somehow. Basically it is no more secure than going back to normal OAuth2 with my app secret stored somewhere.

Am I making this too complicated? Is there some way to keep my PKCEOAuthFlow object in memory from the start to the end of my flow, across the 2 redirects from my app -> Dropbox -> back to my app? I think this question goes beyond Dropbox and would apply to any OAuth2 + PKCE flow implementation in Blazor Webassembly, or really any serverless SPA or PWA.

0 投票
1 回答
136 浏览

single-sign-on - Xamarin Essentials 无法将 Okta 授权代码交换为令牌

我使用的是 OpenID,我们必须切换到 Xamarin.Essentials.WebAuthenticator。
我可以使用 WebAuthenticator.AuthenticateAsync() 从 Okta 获取授权码。
但是,我尝试将该代码转换为访问令牌的所有操作都会返回 400 Bad Request。
Okta 的 API 错误是“E0000021:HTTP 媒体类型不支持异常”,它继续说,“错误请求。接受和/或 Content-Type 标头可能与支持的值不匹配。”

我尝试尽可能多地关注https://developer.okta.com/blog/2020/07/31/xamarin-essentials-webauthenticator,但我们没有像他那样使用混合授权类型。
我们只使用授权码,这意味着我必须打第二个电话,我花了两天时间试图弄清楚如何做。

以下是生成登录 url 和其他一些东西的方法:

0 投票
0 回答
198 浏览

vue.js - 如何在使用 Vue.js 和 ASP.Net Core Web Api 的项目中集成 Identity Server 4(授权代码流 - PKCE)?

我正在寻找一个示例,如何使用 Vue.js 和 ASP.NET Core Web Api 在项目中集成 Identity Server 4(授权代码流 - PKCE)。提前致谢!

0 投票
1 回答
348 浏览

xamarin - 用于 Azure AD 和 Xamarin 的 PKCE 的 OAuth 代码流

Microsoft 提供的所有示例和文档仅在浏览器中提及 PCKE for SPA 应用程序。使用 MSAL 时,Xamarin 本机应用程序是否支持该流程?

0 投票
1 回答
181 浏览

oauth-2.0 - 我们可以在 SPA 中将 PKCE + 授权码授予与 SSO 一起使用吗?

我们正在使用带有 PKCE 授权代码授予的 SPA。现在我们要使用 SSO 登录。但是应用程序(SSO 应用程序)返回授权码,不能在会话中或 SSO 系统的 cookie 中持久存在。