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

Ejabberd Oauth:访问被拒绝

ejabberd - 基于外部 REST API 的自定义花名册模块

MAC OS X 优胜美地上 ejabberd 15.0.4 上的 mod_rest 未启动