问题标签 [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 投票
1 回答
370 浏览

oauth-2.0 - 移动应用程序中没有客户端密码的 OAuth 2.0 授权授予流程中的客户端验证

在使用授权码授权类型为移动应用程序实现 OAuth 2.0 时,我们可以在注册应用程序时在身份提供者上生成 clientid。(我们不会为移动应用程序生成客户端密码)

我的问题是,身份服务器如何验证 response_type=code&client_id=client_id 的第一个请求是否来自正确的移动应用程序?由于客户端 ID 在 URL 中,因此任何人都可以使用读取它并将请求发送到授权服务器。

更新: 根据https://auth0.com/docs/flows/concepts/auth-code-pkce,引入 PKCE 是因为客户端密码在移动设备上不安全。恶意应用程序可以捕获自定义 url。

现在,作为一名黑客,我可以通过使用应用程序的开发窗口流量监控移动默认浏览器来获取应用程序的客户端 ID,例如 A,该应用程序已向身份验证服务器 (IS) 注册。我得到了 stackoverflow 的客户端 ID,我没有在这里披露。我将创建一个移动恶意移动应用程序,它将注册实际移动应用程序 A 的自定义 url。这个应用程序将使用相同的 clientid 和重定向 url 以及 PKCE 质询进行重定向。现在,IS 将如何识别请求 id 是否来自正确的客户端。因为,如链接中所述,如果我能够注册恶意应用程序以捕获移动设备的自定义重定向 url 请求,那么我将能够捕获身份验证代码并使用恶意应用程序执行其余的工作流程。

Google 在创建应用程序时采用捆绑标识符 (IOS) 或应用程序签名 (Android)。它是否有助于以某种方式识别应用程序?

0 投票
0 回答
233 浏览

xero-api - Xero-Api PKCE 授权返回“Invalid_grant”

我正在按照https://github.com/XeroAPI/Xero-Postman-Tutorial-PKCE-Edition的说明与 Xero 集成。在第 7 步“接收并设置您的访问和刷新令牌”中,我收到“Invalid_grant”消息。Xero 的授权适用于返回码和 uri。我生成了一个新代码,仍然是同样的错误。有什么帮助吗?谢谢

0 投票
2 回答
1099 浏览

oauth-2.0 - 使用 IdentityServer 4 中的授权代码流保护公共 API

我在我的应用程序中遇到了一个非常基本的要求。这是我的场景。我正在构建一个自定义电子商务门户,使用 angular 作为前端,rest API 作为后端。我有一个产品列表 API,它将由我的 Angular 客户端应用程序调用,而无需用户的凭据,因为产品列表是一个公共页面。但是,我不希望其他人使用我的产品列表 API。我知道我可以使用客户端 ID 和客户端密码来获取令牌并使用 Identityserver 4 使我的 API 安全,但是,如何避免在 Angular 应用程序中暴露我的客户端密码?任何人都可以很容易地窃取它。有什么方法可以将授权代码流与 PKCE 一起用于公开我的 API,例如不需要用户 ID 和密码的产品列表 API?

0 投票
1 回答
1166 浏览

oauth-2.0 - Oauth2 PKCE 谁应该生成代码验证器和代码质询

我正在编写将与一些 Oauth2 提供程序集成的客户端应用程序。我会将原生 android 应用程序作为前端,将 spring-boot 作为后端。我想将 authorization_code 流与 PKCE 一起使用。我的问题是谁应该生成代码验证器和代码挑战?我的后端还是我的本机应用程序?

我可以看到两个选项:

1)前端正在调用授权端点。后端生成code_verifier和code challenge,返回code challenge给前端,重定向到授权服务器。用户登录,授予权限,然后接收授权码并将其转发到后端。然后后端使用 code_verifier、客户端 ID 和客户端密钥调用授权服务器并接收访问令牌

2) FE 正在生成 code_verifier 和 code challenge。它使用 code_challenge 调用授权提供者,用户登录,授予权限,然后接收授权码。前端使用 code_verifier 转发授权码,然后后端使用授权码、code_verifier、client id 和 client secret 调用授权提供者。

哪种方法更好、更安全?

0 投票
1 回答
755 浏览

spring-boot - oauth2 令牌请求中的附加参数

我正在为 oauth2 客户端开发后端。我正在使用带有 PKCE 扩展的授权流。我正在尝试以在客户端生成代码验证器和代码质询的方式来实现它。所以我必须向我的令牌请求添加其他参数(第二个请求,当输入是授权码并且我的应用程序将其交换为访问令牌时)。我的应用程序必须从请求参数中获取这个 code_verifier 并将其传递给授权服务器,其中包含授权代码、客户端 ID 和客户端密码。

所以现在我正在努力定制 spring-security-oauth2-client 以添加额外的参数。可以通过实现 OAuth2AuthorizationRequestResolver 将此类参数添加到授权请求中,但是是否有类似的方法可以将参数添加到令牌请求中?

或者也许我应该手动实现这个端点?

0 投票
1 回答
173 浏览

oauth-2.0 - 在不泄露应用密钥的情况下将桌面应用连接到 Google 相册

我正在用 Java 编写一个处理照片的开源独立桌面应用程序,并且我正在添加一个功能,让用户将照片上传到他们的 Google 照片帐户,但我面临着一个身份验证/安全问题。

我已注册我的项目以使用 Google Photo API 并下载了我的凭据 JSON 文件。我已经能够成功地将它与java-photoslibrary Github 项目中的示例一起使用,所以一切都很好。

但是,凭证文件包含一个“client_secret”密钥,如果我没记错的话,它不应该被披露(我在这里正确吗?)。但是这些凭证必须以某种方式与应用程序一起分发,并且由于它是开源的,因此基本上是公开的。所以我的问题是:如何在不泄露我的应用程序密钥的情况下向他/她的 Google 照片帐户验证我的应用程序用户?

注意:我已经集成了 Dropbox 上传,他们的桌面应用程序清楚地解释了如何在不使用 OAuth 的令牌流将密钥嵌入桌面应用程序的情况下进行身份验证。谷歌相册有没有等价物?

谢谢。

编辑:取得了一些进展(见下面我自己的答案),但在我终于有时间实施它之后,我意识到在用户授权应用程序并返回有效代码后(耶!),第 5 步(交换代码对于令牌)再次需要 client_secret !:-(

我在没有它的情况下尝试了调用,但我收到“client_secret is missing”错误,所以这不是错字。

经过更多搜索(使用 [google-oauth] 关键字而不是 [oauth-2.0],这说明了一切),似乎“秘密”并不意味着它在 Google 世界中实际上是“秘密”。换句话说,可以将它嵌入到您的应用程序中,因为它是秘密的,但不能以恶意方式使用(希望如此)......

查看这些相关问题的答案:

一个 Google 页面甚至提到“在这种情况下,客户端机密显然不被视为机密”。

来谷歌,解释一下安全性是如何工作的:-)

0 投票
1 回答
506 浏览

oauth-2.0 - 在 OpenID 连接授权代码流中使用 PKCE 时我们需要 client_secret 吗?

根据PKCE 规范,OAuth 提供者使用 code_verifier 来避免中间人攻击。我的理解是,它是基于 JavaScript 的单页应用程序 (SPA) 将 OAuth 代码交换为令牌的最佳选择。

当我用 Google API 进行实验时,它说“client_secret is missing”。

这是 HTTP 请求和响应。

ID:1 地址:https : //oauth2.googleapis.com/token Http-Method:POST Content-Type:application/x-www-form-urlencoded Headers:{Content-Type=[application/x-www-form- urlencoded], Accept=[ / ]} Payload: grant_type=authorization_code&code=4%2F1AH3Ubnm550IoT8AZ_e_eqLYDn3-JyXVo22LOcAlsWPnxTV_o0tV2N1YMNFtqhvFm65n4tuZmHfK5tkKLOsbnRw&scope=openid+profile+email&redirect_uri=https%3A%2F%2Flocalhost%3A8443%2Fdemo&client_id=myclientid.apps.googleusercontent.com&code_verifier=iv8n89-Dh3QD1uroYm6e6jcpZwxff60m -RYYlmLYArun6KF8o0z%7Ee3EjyVyYUp.4XxSbyI47QQSCMrY542sLWSUnxAG8e0a%7ETjmF_UFioJMA_ctB2jz6qbcYtu9uUOKp

ID:1 响应代码:400 编码:UTF-8 内容类型:application/json;charset=utf-8 标头:{Accept-Ranges=[none], Alt-Svc=[h3-28=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; 马=2592000;v="46,43"],缓存控制=[私有],内容类型=[应用程序/json;charset=utf-8], Date=[Mon, 22 Jun 2020 04:41:53 GMT], Server=[scaffolding on HTTPServer2], transfer-encoding=[chunked], Vary=[Origin,Accept-Encoding, Referer, X-Origin],X-Content-Type-Options=[nosniff],X-Frame-Options=[SAMEORIGIN],X-XSS-Protection=[0]} 有效载荷:{“错误”:“invalid_request”、“error_description”:“client_secret 丢失。” }

我的理解是“我们在传递 code_verifier 时不需要 client_secret”是错误的还是 Google 不支持 PKCE 或者我错过了请求中的其他参数?请帮忙。

0 投票
0 回答
182 浏览

angular - Angular-oauth2-oidc 清除 localStorage 过期令牌信息

我正在尝试为一个 Angular FE 项目自定义 angular-oauth2-oidc 库中的 PKCE 流。

我也在为这个库使用 localStorage 来存储令牌和等信息,但我似乎无法找到一种方法来清除 localStorage 中过期的令牌信息。

这不应该自动完成吗?

0 投票
3 回答
2414 浏览

oauth - 我们真的需要 client_secret 来获取 PKCE 流上的 access_token 吗?

我正在构建 2 个应用程序;一个前端,一个后端。

后端将使用 Rails API + Doorkeeper Gem(oauth2 提供者)构建,而前端将使用 React Native 构建。

目前,我正在使用“客户端凭据授予流程”,目前运行良好。但是经过一段时间的研究,这个流程不应该在仅限客户端的应用程序中使用,因为它暴露了client_secret如果有人反编译了应用程序。

我还阅读了仅需要client_id. 但这个流程现在似乎已经过时了?

并据此:https ://auth0.com/docs/api-auth/which-oauth-flow-to-use#is-the-client-a-single-page-app-

建议使用“带有 PKCE 的授权码授予”而不是“隐式授予流程”。我能够使它工作,但问题是它仍然需要client_secret才能获得access_token,这是应该的吗?

这是我正在做的示例流程:

这会给我以下回应:

然后我将使用上面的代码通过下面的请求获取访问令牌:

现在问题来了,为了交换codeaccess_token仍然需要client_secret. 如果两者都只会公开我的,它与“客户凭证授予流程”有何不同client_secret

上面的命令将返回以下内容:

如果我不包括client_secret在请求中是响应:

所以这是我的问题:

  1. 我们真的需要client_secret进入access_tokenPKCE 流程吗?
  2. 为什么建议使用“PKCE Flow”,如果它只会暴露client_secret
  3. 它与同样公开的“客户凭证授予流程”有何不同client_secret

Doorkeeper PKCE 文档:https ://github.com/doorkeeper-gem/doorkeeper/wiki/Using-PKCE-flow

0 投票
2 回答
893 浏览

javascript - Spotify PKCE code_verifier 不正确

我很高兴听到我现在可以使用 Spotify Web API,而无需通过 PKCE 使用后端应用程序。不幸的是,我似乎有某种误解,无法让它发挥作用。

我可能在此过程中犯了一些小错误,但我做了一次无济于事,我擦干净石板并再次尝试,但仍然没有运气。由此我得出结论,我一定是误解了文档

我会解释我在做什么,希望这里有人能指出我遗漏了什么或做错了什么。我假设我有一个基本的概念误解。

我首先使用名为 crypto-random-string 的 npm 包生成一个加密随机字符串。我将其存储在浏览器的本地存储中,然后使用 js-sha256 对其进行哈希处理,然后使用另一个名为 base64url 的 npm 包对其进行编码。

从这里,我使用正确的 url 参数重定向到 /authorize 端点。我已经成功地做到了这一点,然后相应地被重定向到我提供的redirect_uri,在那里我从url参数中获取给定的代码。

此时,我尝试使用 client_id、grant_type、我从 url 参数获得的代码、我的 redirect_uri 和本地存储的 code_verifier 获取 /api/token 端点。

此时,经过我的两次尝试,我收到了错误:

有什么我明显做错了吗?该错误使我相信就 code_verifier 的实际生成而言我做错了什么,但我不知道该问题可能是什么。