oauth-2.0 - 通过命令行获取 Auth0 访问令牌
问题描述
我被迫使用一个不符合人体工程学的网站(我们称之为zzz
),它使用 auth0 进行身份验证,并在内部使用 REST API,我强烈希望直接使用 API。
使用浏览器检查器,我可以看到该 API 是如何工作的,如果我使用在Authorization: Bearer
那里找到的 JWT 访问令牌(使用 传输),我可以编写对 API 的访问的脚本。
给定我的用户名和密码,我面临的问题是通过 auth0 获取这样的 JWT 访问令牌。
当我使用基于浏览器的登录时,我看到zzz
将我重定向到
https://zzz.eu.auth0.com/login
?state=g6…mo
&client=uz…6j
&protocol=oauth2
&response_type=token%20id_token
&redirect_uri=https%3A%2F%2Ffoo.zzz.com%2Fcallback
&scope=openid%20read%3Amore%20scopes…
&audience=zz-api-prod
&nonce=0G…L7
&auth0Client=ey…n0%3D
(为方便起见换行)
我现在可以手动输入用户名和密码,然后登录,这似乎执行了以下步骤:
一个
POST
到https://zzz.eu.auth0.com/usernamepassword/login
与身体
{ "client_id":"uz…6j", "redirect_uri":"https://foo.zzz.com/callback", "tenant":"zzz", "response_type":"token id_token" "connection":"zzz-production-users", "username":"…", "password":"…", "nonce":"0G…L7", "state":"g6…mo", "sso":true, "_intstate":"deprecated", "_csrf":"fb…KI", "audience":"zzz-api-prod", "auth0Client":"ey…n0=", "scope":"openid read:stores more:scopes …", "protocol":"oauth2" }
和回应
<form method="post" name="hiddenform" action="https://zzz.eu.auth0.com/login/callback"> <input type="hidden" name="wa" value="wsignin1.0"> <input type="hidden" name="wresult" value="ey…tE"> <input type="hidden" name="wctx" value="…"> <noscript> <p> Script is disabled. Click Submit to continue. </p><input type="submit" value="Submit"> </noscript> </form>
登录页面上的 JS 似乎按下了那个提交按钮,导致 POST
https://zzz.eu.auth0.com/login/callback
重定向到
https://foo.zzz.com/callback #access_token=ey…7Q &scope=openid%20read%3Amore%20scopes… &expires_in=7200 &token_type=Bearer &state=%7B%7D &id_token=ey…Sg
…其中包含我想要的宝贵访问令牌。
尝试编写这个精确流程的脚本,这将涉及解析返回的 HTML 以提取wctx
和wresult
参数,是非常乏味的。
所以我的问题是:
有没有办法access_token
使用命令行 curl 或者一些简单的 python 代码/库来获得更方便编写脚本的其他方式?
我尝试了在 auth0 文档网站(例如https://auth0.com/docs/api-auth/tutorials/password-grant#realm-support)上找到的各种东西,但无法让它们工作;可能是因为它们需要在 auth0 设置中由 zzz 显式启用?
解决方案
正确的方法应该是这些之间的分离:
- 不符合人体工程学的网站(客户端 A) - 使用隐式流程
- 网络 API
- 客户端 B(您的命令行)- 使用不同的流程
在 Auth0 中,您应该为客户端 B 配置一个新的 OAuth 客户端条目,它可能应该使用不同的流程——也许是您提到的密码授权。
您至少可以通过这种方式获得令牌。API 是否接受来自您的调用可能取决于其他设计方面。
推荐阅读
- javascript - 将选中的属性赋予循环内的单选按钮
- excel-formula - AND 语句在 IF 语句中失败,但在单独使用时有效
- c - 不使用 if 语句对 printf 的单个函数调用?
- python - 列是否可以包含在不直接参与计算的 groupby 语句中?
- apache-spark - 如何获得二进制类的精度、召回率、准确率和 F1
- android - 如何将这些特定数据从 firebase 检索到我的 android studio 应用程序列表视图中?
- sql-server - SQL Server 链接服务器(在 Oracle DB 上)显示重复的表
- matlab - 如何用矩阵定义函数
- datepicker - 从今天起在 Datepicker 1.6.4 中仅禁用 2 周?
- typescript - 无法从模式拼接中的另一个 schema.graphql 文件中的其他 schema.graphql 文件访问共享模式