WebAPI 和 401 与 200
Posted
技术标签:
【中文标题】WebAPI 和 401 与 200【英文标题】:WebAPI and 401 vs 200 【发布时间】:2018-08-11 13:52:01 【问题描述】:我正在构建一个 WebAPI 作为一个学习项目并尝试使用最佳实践。我的第一次尝试是一个身份验证 API,它接受一个身份验证对象 (JSON):
username: myusername,
password: mypassword
它将我在 /api/authenticate 上的 API 作为 POST 调用,传递对象。
在我的 .Net 代码中,我进行了一些检查,如果用户名/密码通过,我创建一个 jwt 令牌,并将其与角色一起返回。我的 API 在正文中返回 200 和令牌(Chrome 开发者工具中的响应显示“ey.....”,这是我的 jwt)。
如果我得到一个无效的用户名/密码,我会返回一个 401。
我不确定这是否正确。我应该在正文中返回 200 - 和其他一些有效载荷吗? (不知道是什么),然后我的登录是否应该返回JSON,比如:
success: true,
error: null
token: "ey.....",
登录失败返回:
success: false,
error: null
token: null,
然后一个错误:
success: false,
error: 500
token: null,
然后客户端代码使用它来决定做什么?我正在尝试在这里制定最佳实践,以了解如何在 WebAPI 中处理此问题。
【问题讨论】:
您在这里问了两个不同的问题 1) 错误、JSON 或 HTTP 错误返回什么? 2) 我的代码没有从我的 API 中获取 JSON 对象。你不应该在你的帖子中问一个以上的问题。我已经回答了第一个问题,其他一些人可能会添加更多答案。我建议删除第二个问题,复制它并创建另一个问题。 同时使用 - 返回 401(不要返回 200,因为它表示成功),并在正文中返回带有详细描述的 json。 【参考方案1】:我认为这里没有真正的“最佳实践”。一些 API 会返回一个错误对象,就像您对 JSON 所做的那样。那完全没问题。其他 API 返回 HTTP 错误(401、500 等...)。其他 API 两者都返回。每种方法各有利弊,因此请选择您喜欢或最适合您需求的方法。
如果您使用第一种方法,请不要限制自己返回 HTTP 代码。相反,返回的代码可以为您和您的 API 的使用者提供更具体的错误参考。例如,代码 401 没有告诉我身份验证失败的原因。可能这对安全性来说很好,但我只是在这里用作示例,因此您可以返回代码 1001 用于不正确的凭据,1002 用于锁定的帐户,1003 用于等待批准的帐户,等等......
第一种方法的优点:API 使用者可以使用简单的if...else
或switch
逻辑在同一代码中处理所有内容。它也更容易测试。缺点:你仍然需要使用try...catch
,因为对API的请求仍然可能失败,所以消费者代码会有上述逻辑加上try...catch
逻辑。
第二种方法的优点:它更符合我们通常做事的方式。使用try...catch
处理所有错误,里面的代码只会用于成功路径。缺点:测试起来有点困难,而且你会遇到 HTTP 错误代码。
第三种方法是两者的结合。在某些情况下,这可能是矫枉过正,并增加了一些不必要的复杂性和重复性,但在其他情况下,它可以结合两个世界的好处。
【讨论】:
【参考方案2】:这里我给出了一种不同的返回响应消息的方式...... 我希望,这将有助于您返回响应消息...
//登录成功
在下面的代码中,它显示了成功响应...
return Content(HttpStatusCode.Ok, error); 这将有助于在 Postman Tool 的标头中返回状态码。
if (result == null)
var error = new
Success = "true",
Token = "your token"
;
return Content(HttpStatusCode.Ok, error);
//未经授权的用户登录
在下面的代码中,它显示了登录失败的响应...
这里我们可以向用户提及错误状态作为响应...return Content(HttpStatusCode.Unauthorised, error); 这将有助于在标题中返回状态码邮递员工具。
if (result == some condition)
var error = new
Error = new
StatusCode = HttpStatusCode.Unauthorised,
Message = "Invalid Credential...! ",
InternalMessage = "Some message"
;
return Content(HttpStatusCode.Unauthorised, error);
//对于错误
在下面的代码中,它显示了登录失败的响应...
这里我们可以向用户提及错误状态作为响应...return Content(HttpStatusCode.InternalServerError, error); 这将有助于在标题中返回状态码邮递员工具。
if (result == somecondition)
var error = new
Error = new
StatusCode = HttpStatusCode.InternalServerError,
Message = "Error in functionality...!",
InternalMessage = "Some message"
;
return Content(HttpStatusCode.InternalServerError, error);
【讨论】:
以上是关于WebAPI 和 401 与 200的主要内容,如果未能解决你的问题,请参考以下文章
您如何将状态 401 从 WebAPI 返回到 AngularJS 并包含自定义消息?
WebApi 2 在使用自定义 JWT 令牌进行授权时总是返回 401
ASP.NET Core JWT 身份验证以保护 webAPI [Authorize] 属性错误 401 Unauthorized