通过命令行获取Auth0访问令牌

时间:2020-08-05 16:49:48

标签: oauth-2.0 jwt auth0

我被迫使用一个不符合人体工程学的网站(我们将其称为zzz),该网站使用auth0进行身份验证,并在内部使用REST API,并且我强烈希望直接使用该API。

使用浏览器检查器,我可以看到该API的工作方式,并且如果我使用在那里找到的JWT访问令牌(使用Authorization: Bearer传输),就可以编写对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以提取wctxwresult参数。

所以我的问题是:

是否有一种方法可以使access_token更加简便,仅使用命令行curl或一些简单的python代码/库来编写脚本?

我尝试了在auth0文档网站(例如https://auth0.com/docs/api-auth/tutorials/password-grant#realm-support)上找到的各种方法,但是无法使它们起作用。大概是因为zzz需要在其auth0设置中明确启用它们?

1 个答案:

答案 0 :(得分:0)

正确的方法应该是将两者分开:

  • 符合人体工程学的网站(客户端A)-使用隐式流程
  • Web API
  • 客户端B(您的命令行)-使用不同的流程

在Auth0中,您应该为客户端B配置一个新的OAuth客户端条目,该条目可能应该使用不同的流程-也许是您提到的密码授予。

您至少将能够以这种方式获得令牌。 API是否接受您的调用可能取决于其他设计方面。