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...elseswitch 逻辑在同一代码中处理所有内容。它也更容易测试。缺点:你仍然需要使用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的主要内容,如果未能解决你的问题,请参考以下文章

从角度访问webapi时出现401未经授权的错误

未经授权的 webapi 调用返回登录页面而不是 401

您如何将状态 401 从 WebAPI 返回到 AngularJS 并包含自定义消息?

WebApi 2 在使用自定义 JWT 令牌进行授权时总是返回 401

ASP.NET Core JWT 身份验证以保护 webAPI [Authorize] 属性错误 401 Unauthorized

WebApi 2始终使用自定义JWT令牌返回401授权