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。
我是 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。