Rest 我应该在401错误响应中公开身份验证URI吗?

Rest 我应该在401错误响应中公开身份验证URI吗?,rest,authentication,Rest,Authentication,我在RESTAPI中使用OAuth2,如果我的访问令牌无效,我的API将返回401错误。 我的401响应现在没有意义,我想知道是否可以在响应中放置身份验证URI?差不多 { "error": 401, "authentication_uri": "https://example.com/login?client_id=123&response_type=token&redirect_uri=http://example.com/app/" } 我可以这样做吗?这安全吗?

我在RESTAPI中使用OAuth2,如果我的访问令牌无效,我的API将返回401错误。 我的401响应现在没有意义,我想知道是否可以在响应中放置身份验证URI?差不多

{
  "error": 401,
  "authentication_uri": "https://example.com/login?client_id=123&response_type=token&redirect_uri=http://example.com/app/"
}

我可以这样做吗?这安全吗?(似乎所有这些参数都在URL中公开了…)还有其他常见的方法可以从401获得有意义的响应吗?我找不到有关此主题的有用信息。

我不是安全专家,但我认为这样做没有问题。我不知道隐藏如何进行身份验证有什么价值,我也看不到你公开了他们还没有的任何东西(假设原始请求中有客户端id和重定向uri)。

回答我自己的问题:虽然这当然是可能的,而且有好处,因为你不需要事先知道身份验证uri,它有一些陷阱

假设您在
http://localhost
并且您希望与相同的REST API通信。RESTAPI不能仅仅从Referer或Origin头字段推断出您的
客户端id
,因为它总是
http://localhost
。您可以开发“应用程序1”或“应用程序2”,并且每个应用程序都有不同的
客户端id
。因此,你需要支持。例如:


有关URI模板的更多示例,请参阅。

客户端id和重定向URI不会出现在初始请求中。也许最初的要求是,然后我得到了401。我认为如果身份验证uri发生变化,这将是有益的(可能是因为我对api使用了调试版本,所以我只需要api的基本url,而不需要事先知道我的身份验证url)。。。为什么要使用身份验证URI而不是授权标头?401响应必须返回带有要使用的身份验证方案的WWW Authenticate标头。看起来你两次都在重新发明轮子。好吧,我最近有很多这样的对话(见这里:)。我个人希望对所有链接只使用HTTP头,但我似乎迟早会在JSON响应中需要链接,所以我会同时使用这两种方法以保持一致(在有意义的地方使用HTTP头,并且在JSON响应中始终使用链接)。许多新的规范似乎也支持这一点。我刚刚看到你就是那个在另一个链接上回复我的人:)
{
  "error": 401,
  "authentication_uri": "https://example.com/login?redirect_uri=http://localhost&response_type=token{&client_id}"
}