Ejabberd OAuth / REST 401 未经授权
Posted
技术标签:
【中文标题】Ejabberd OAuth / REST 401 未经授权【英文标题】:Ejabberd OAuth / REST 401 Unauthorized 【发布时间】:2016-02-09 08:52:40 【问题描述】:我正在尝试使用 /api/connected_users
端点请求 Ejabberd REST Web 服务,但该请求总是返回 401 Unauthorized HTTP 错误。
这是我的 OAuth 配置。
-
port: 5280
module: ejabberd_http
request_handlers:
"/websocket": ejabberd_http_ws
# OAuth Support
"/oauth": ejabberd_oauth
# ReST API:
"/api": mod_http_api
web_admin: true
http_bind: true
register: true
captcha: false
...
commands_admin_access: configure
commands:
- add_commands: user
oauth_expire: 3600
oauth_access: all
如文档中所述,我使用以下 URL 为 admin
用户生成 OAuth 2 访问令牌。
http://localhost:5280/oauth/authorization_token?response_type=token&client_id=myclient&redirect_uri=http://localhost:5280&scope=sasl_auth
它返回我的 OAuth 令牌。
http://localhost:5280/?access_token=oLn8Hebh051l2PdCM15tSvHrEI25CpBs&token_type=bearer&expires_in=3600&scope=sasl_auth&state=
最后要请求api/connected_users
端点,我执行以下操作。
curl -v -X GET -H "X-Admin: true" -H "Authorization: Bearer oLn8Hebh051l2PdCM15tSvHrEI25CpBs" http://localhost:5280/api/connected_users
但它总是返回 401 Unauthorized 错误。
在我的ejabberd.log
文件中,我有这个。
2016-02-09 09:47:12.177 [info] <0.497.0>@ejabberd_listener:accept:333 (#Port<0.16419>) Accepted connection 127.0.0.1:62395 -> 127.0.0.1:5280
2016-02-09 09:47:12.177 [debug] <0.546.0>@ejabberd_http:init:154 S: [[<<"websocket">>],ejabberd_http_ws,[<<"oauth">>],ejabberd_oauth,[<<"api">>],mod_http_api,[<<"register">>],mod_register_web,[<<"admin">>],ejabberd_web_admin,[<<"http-bind">>],mod_http_bind]
2016-02-09 09:47:12.177 [info] <0.546.0>@ejabberd_http:init:158 started: gen_tcp,#Port<0.16419>
2016-02-09 09:47:12.177 [debug] <0.546.0>@ejabberd_http:process_header:281 (#Port<0.16419>) http query: 'GET' <<"/api/connected_users">>
2016-02-09 09:47:12.177 [debug] <0.546.0>@ejabberd_http:process:353 [<<"api">>,<<"connected_users">>] matches [<<"api">>]
2016-02-09 09:47:12.178 [info] <0.546.0>@mod_http_api:log:388 Admin call connected_users [] from 127.0.0.1:62395
那么如何配置 Ejabberd 以允许 admin
用户请求所有 Ejabberd REST Web 服务?
我的用户存储在 mysql 中,因为 OAuth 令牌存储在 Mnesia 中,这可能是问题吗?
谢谢,
巴蒂斯特
【问题讨论】:
确保您在模块部分的 ejabberd.yml 中启用了支持 OAuth 命令的模块。提供详细的日志和模块配置。 您好 Sunil,感谢您的回复,您指出的内容写在文档“支持您要使用的 OAuth 命令的模块”中,但这是模块和 OAuth / REST I 的唯一说明成立。那么那些“支持 OAuth 命令的模块”是什么?我不明白我必须做什么,在文档docs.ejabberd.im/admin/guide/configuration 的配置部分中,它们与“OAuth”或“REST”模块无关。你能解释一下在“模块”部分添加哪些模块吗? (我添加了“mod_http_api”但仍然遇到授权错误)。 @BaptisteGaillard 你有没有以某种方式解决它?我也面临同样的情况 我也有同样的问题。请帮忙。 @BaptisteGaillard 你能解决这个问题吗?如果有,请告诉。 【参考方案1】:如果在 ejabberd.yml 中以这种方式指定,请确保在输入用户名时使用 @host。我没有收到来自 REST 请求的任何响应,因为我只使用 admin 作为用户,什么时候应该在用户名中使用 admin@somehost。
如果这没有帮助,请告诉我。
【讨论】:
【参考方案2】:确保输入正确的用户(jid):(用户(jid):用户@主机名)
它对我有用。
【讨论】:
以上是关于Ejabberd OAuth / REST 401 未经授权的主要内容,如果未能解决你的问题,请参考以下文章
总是为我的 Laravel Passport 生成的 OAuth 2 令牌响应 401(未授权)
如何诊断尝试在 c# .NET Core 中获取 OAuth2 不记名令牌的 401 错误?
使用Javascript的WooCommerce Rest API Oauth