Ejabberd 中的管理员 Oauth 身份验证

Admin Oauth authentication in Ejabberd

我是 Ejabberd 和 Erlang 的新手,我很难理解为什么我只能使用 GET 方法而不是 POST 进行身份验证。

我可以使用 GET 成功进行身份验证 (https:///myserver/oauth/authorization_token?response_type=token&client_id=Client1&redirect_uri=http://client.uri&scope=ejabberd:admin),它会打开一个 Web 表单,我将输入我的凭据并提交,它会将我重定向到 url,例如 http://client.uri/?access_token=VuzKqO55OZoCFp45lBkapLis3dsMGKB7&token_type=bearer&expires_in=31536000&scope=ejabberd:admin&state=

问题是,我不想使用我想直接从我的应用程序中使用 API 的网络表单,但不允许我直接使用 POST 方法,即使那是 Ejabberd 在幕后使用的东西。

我可以在 ejabberd_oauth.erl 两种方法中看到它。

process(_Handlers,
    #request{method = 'GET', q = Q, lang = Lang,
         path = [_, <<"authorization_token">>]})

process(_Handlers,
    #request{method = 'POST', q = Q, lang = _Lang,
         path = [_, <<"authorization_token">>]}) 

我不明白为什么 GET 可以访问而 POST 不能。

I'm not allowed to use the POST method directly

你的意思是这样的吗?

我首先按照标准程序,嗅探了 HTTP 流量。然后我写了一个小的shell脚本来直接执行POST:

call.sh的浓度:

CONTENT='username=user1%40localhost&password=asd&response_type=token&client_id=Client1&redirect_uri=http%3A%2F%2Fclient.uri&scope=get_roster+sasl_auth&state=&ttl=31536000'

curl -v -k -X POST -H "Content-type: application/x-www-form-urlencoded" \
     -d "${CONTENT}" "http://localhost:5280/oauth/authorization_token"

结果:

❯ ./call.sh
...
< Location: http://client.uri?access_token=4Vh9Ib9JOJYFvUILjzNouNlrkWRIsgs8&token_type=bearer&expires_in=31536000&scope=get_roster sasl_auth&state=
...

https://docs.ejabberd.im/developer/ejabberd-api/oauth/#authorization-token 中所述,获取令牌的更复杂方法是​​使用 oauth_issue_token ejabberd 命令。为此,您必须启用 ReST 或 ejabberd_xmlrpc,并且您必须限制权限,因为这样可以访问所有 ejabberd。