linux http error 401,出现HTTP: 401 的时候的解析思路-程序员宅基地

技术标签: linux http error 401  

说在前面的话:

最近工作确实比较忙了一些, 毕竟是年初,很多事情都需要重新布置, 一年之计在于春嘛;

这几天,新来了一些小伙伴, 在他们接下来的一些工作中, 也发现了一些比较有意思的bug, 有些bug确属不应该,不过也有些bug比较有意思, 有时间了,我会慢慢的整理一些发上来和大家分享, 今天先分享一个: HTTP: 401

介绍: 什么是HTTP: 401

时常做应用开发的伙伴们,估计大家对这个数字并不陌生, 毕竟只要你的应用需要申请服务器数据, 那么难免会遇到它, 当然我的新来的这批小伙伴们也比较幸运的遇到了它, 嗯, 确实比较幸运, 因为bug出现,就是学习和进步的时候到了!

所以,我也就花了一些空余时间来为大家整理了一下;

常见的HTTP:401错误码:

401.1 - Logon failed. -登陆失败

401.2 - Logon failed due to server configuration.-基于服务器配置的登陆失败

401.3 - Unauthorized due to ACL on resource.-资源访问控制列表返回未授权

401.4 - Authorization failed by filter.-服务器filter返回未授权

401.5 - Authorization failed by ISAPI/CGI application.-服务器ISAPI/CGI返回未授权

对于401,我们可以用一句话描述它:那就是 HTTP 401 错误 - 未授权: (Unauthorized) [绝大多数情况下]

简单的来说: 就是你的Web服务器认为,客户端发送的 HTTP 数据流是正确的,但进入网址 (URL) 资源 , 需要用户身份验证 , 而相关信息 尚未被提供, 或 已提供但没有通过授权测试。

这就是通常所知的“ HTTP 基本验证 ”。

而需客户端提供的验证请求在 HTTP 协议中被定义为 WWW – 验证标头字段 (WWW-Authenticate header field) 。

那这个401错误码 什么时候会产生呢?

HTTP 循环中的 401错误

任何客户端 ( 比如浏览器,比如APP等等 ) ,都需要通过以下循环去向服务器请求数据:

1.首先从你的站点的 IP 名称 ( 即您站点的网址-URL, 不带起始的 ‘http://') 获得一个 IP 地址。这是由DNS来解析的;

2.接着, 打开一个 IP 套接字 (socket) 连接到该 IP 地址。

3.通过该套接字写 HTTP 数据流。

4.从您的Web服务器接受响应的 HTTP 数据流。该数据流包括状态编码, 其值取决于 HTTP 协议 。 解析该数据流得到 状态编码和其他有用信息。

而401错误在容易在以上所述的最后一步产生,即当客户端收到 HTTP 状态编码并识别其为 ‘401‘ 时

例如我这里做了一个测试: 大家看代码 ,(由于请求网络服务器比较不好操作,所以,这个测试我用了自己电脑搭建的本地服务器;)

首先我给自己电脑的本地服务器(webDav)发送一个put请求, 准备上传一张图片到webDav服务器

NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/uploads/123.jpg"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod =@"put";

然后获取一张本地的图片,

//本地文件

NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head2.png"withExtension:nil];

[[[NSURLSession sharedSession] uploadTaskWithRequest:request fromFile:

fileUrl completionHandler:^(NSData *_Nullabledata, NSURLResponse *_Nullableresponse, NSError *_Nullableerror) {

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}] resume];

接着开始执行:

这里就会出现问题:

输出结果:

ca3e561e09ae

输出结果

通过输出结果,可以明显的看得到 服务器返回的是401, 因为我们没有授权, 那么怎样授权呢?

解决 401 错误 – 情景一 : 有防御性的安全策略

通常情况下

每个Web服务器都有自己的方式管理用户验证。通常由该网站的网络安全员(例如,系统管理员)决定哪些用户被允许访问该网址。 该人员使用 Web 服务器软件来建立这些用户的用户名及其密码。 因此, 如果您需要访问某个网址(或您忘记了自己的用户名和密码), 只有该网站的网络安全员可以帮助您。任何安全问题需直接提交给他们。

如果你认为该网站上的网页 应该 是对任何互联网用户开放的, 那么 401 信息就表明了一个更深层问题。 首先,您可以通过一个浏览器检查您的网址。 该浏览器应该运行在一台您以前从未使用过, 也不包含任何有关您的信息的计算机上, 同时, 您还应避免使用您以前用过的身份验证(密码等)。 理想情况是, 这一切应该通过一个完全不同于任何您用过的互联网连接(例如由不同的互联网服务供应商- ISP 提供的拨号连接)。 简而言之,您要模拟一个完全陌生的人通过网上冲浪访问您的网页的情况。

如果这种通过浏览器的检查表明没有授权问题,则可能是您的 Web 服务器 ( 或周边系统 ) 被设置为不允许某种 HTTP 传输模式。 换句话说就是, 来自一个知名浏览器的 HTTP 通讯是允许的, 但来自其他系统的自动通讯则被拒绝, 并生成 401 错误代码。这是一种异常情况, 但是也许表明您的 Web 服务器周围 采取了非常具有防御性的安全策略。

比如: iOS9.0之后,就统一规定,对于http请求,只有经过苹果认可的证书且是https:// 的,才可以直接通过访问,如果还是http:// 或者,不是苹果认可的证书的https,都是不可以直接访问的, 所以,通常情况下,解决这类问题,我们会事先在info.plist文件中做一些配置, 也就是我们常说的ATS配置: 我们可以把下面这几行配置添加到info.plist文件中, 首先用源代码方式打开info.plist文件, 然后拷贝下面的几行代码: 如下:

NSAppTransportSecurity

NSAllowsArbitraryLoads

解决 401 错误 – 情景二: 密码,账户名错误

情景二: 需要提供密码和账号

当服务器需要验证您的帐户时,您可以有选择性地提供两项信息

网站用户名,

网站密码。

当然只有当您的站点使用 HTTP 基本验证时您才应该提供这些信息。 如果您不提供这些信息,服务器是通不过的,您也会得到 401 错误。

就如最上面的put请求的代码, 在服务器端,其实我是设定了需要密码和账号才能通过的,

所以,这种情况下,我们就需要提供账号和密码给服务器了,

当然,实际开发中,密码和账号是需要严格加密的,都是需要和服务器人员沟通一套非常保密的加密的方法的, 整个过程是比较复杂的,

不过由于我这里只是做一个演示, 那么就不需要特别复杂了, 就简单一点,说明一个思路即可:

这里,我就手动来拼接一个账号和密码, 密码加密就用最简单的base64编码;

假设我们的账号是admin,密码也是123456, 那么我们怎样来设定密码呢?

首先我们需要定义方法,来拼接密码,并转化为base64编码;

//定义一个方法: 获取授权的字符串

- (NSString *)getAuth:(NSString *)name pwd:(NSString *)pwd {

//拼字符串 admin:123456

NSString *tmpStr = [NSString stringWithFormat:@"%@:%@",name,pwd];

//base64编码

tmpStr = [self base64Encode:tmpStr];

return [NSString stringWithFormat:@"Basic %@",tmpStr];

}

//base64编码

- (NSString *)base64Encode:(NSString *)str {

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

return [data base64EncodedStringWithOptions:0];

}

然后我们在发送put请求的时候, 就同时提供授权

//上传文件

- (void)uploadTask {

NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/uploads/123.jpg"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod = @"put";

//设置账号和密码

//Authorization: Basic YWRtaW46MTIzNDU2

// admin:123456

[request setValue:[self getAuth:@"admin" pwd:@"123456"] forHTTPHeaderField:@"Authorization"];

//本地文件

NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head2.png" withExtension:nil];

[[[NSURLSession sharedSession] uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"--%@",str);

}] resume];

}

执行结果:

ca3e561e09ae

执行结果:

通过结果,我们可以看出, 已经上传成功了, 也就是说,我们顺利的解决了401问题,

总结解决bug的思路:

如果遇到401问题, 我们解决的思路,可以这样来考虑:

优先考虑是否是需要验证,也就是是否需要授权账号和密码信息;

如果是开放的服务器资源, 需要考虑的是是否有防御性的安全策略;

一般情况下,都属于这两种原因,

以上属于我整理的,如有不足之处,望大家斧正! 感谢!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33603397/article/details/116962781

智能推荐

EasyDarwin录像存储

前文介绍了EasyDarwin的基本使用流媒体服务器EasyDarwin-CSDN博客文章浏览阅读146次。前文:为何要使用流媒体服务器_多终端访问监控要上流媒体服务器吗-CSDN博客我们知道,监控摄像机的工作原理就是将自然界的光影,通过摄像机镜头对焦到“靶芯”(CMOS),实现了光(信号)到电(信号)的转换,然后摄像机图像处理器将模拟信号转为数字信号,通常编码为H.264或更好的H.265的MP4格式,通过网络向后端(存储、NVR、终端)提供视频流。发出后发现录像存储部分没有介绍,本文补上。

CentOS下编译Linux内核_centos编译内核-程序员宅基地

文章浏览阅读5.6k次,点赞7次,收藏62次。前言编译内核是一项很简单的事情,但却是进入Linux内核世界的第一步,想要开发内核代码,想要了解内核的运行机制,第一步就是编译Linux内核,以下是在centos7.5环境下编译内核的具体流程。1、下载内核内核的源码的官方网站为The Linux Kernel Archives,在此网站下载最新内核源码。2、解压内核源码[root@rt7_node03 src]# tar xvf linux-5.16.14.tar.xz -C /usr/src/[root@rt7_node03 sr_centos编译内核

私.Modbus测试_ZC01_TCP方式-程序员宅基地

文章浏览阅读245次。ZC:这个例子是使用TCP来交互midbus协议数据,我在这个例子里面没有查找到 dll或so文件,运行过程中也没有提示需要dll或so文件 也没有说缺少函数之类的,应该是 没有用到dll或so文件的。ZC:这是使用 TCP的方式来传输 modbus协议数据包的,想追一下源码 看看到底是不是 socket,追到 ModbusMaster.class的 调用函数sendImpl(......_batchread batch = new batchread<>();

python运行程序的快捷键_4.Python IDLE使用方法详解(包含常用快捷键)-程序员宅基地

文章浏览阅读1.5k次。在安装 Python 后,会自动安装一个 IDLE,它是一个 Python Shell (可以在打开的 IDLE 窗口的标题栏上看到),程序开发人员可以利用 Python Shell 与 Python 交互。本节将以 Windows7 系统中的 IDLE 为例,详细介绍如何使用 IDLE 开发 Python 程序。单击系统的开始菜单,然后依次选择“所有程序 -> Python 3.6 -> IDL..._python idle 如何自动补函数

Unity关于对象池的使用_unity find prefab名字有个(clone)-程序员宅基地

文章浏览阅读801次。在游戏中大量的出现的,比如敌人,子弹,都可以用到对象池,为什么要用的对象池呢?其实是因为系统在创建,销毁对象是非常消耗内存的,这样对优化内存会有很大的帮助。回头再总结一下优化方面的注意方面。那么,如何使用,或者说如何创建对象池呢?首先我们Assets 下创建一个Resources文件夹。里面放上需要重复创建的预制体。(注意给这个预制体加上刚体),创建脚本using UnityEngin_unity find prefab名字有个(clone)

Linux 指令lsblk 作用,以及查看cpu使用情况和磁盘IO iostat指令详解

(列表块设备)命令是一个非常实用的工具,用于显示所有可用的块设备信息,如硬盘、USB驱动器、SD卡以及它们的分区。这个命令以易于理解的树状结构展示这些信息,清晰地表明了设备间的层次关系和依赖性。是一个用于监控Linux系统中CPU使用情况和磁盘I/O统计信息的命令行工具,它是sysstat包的一部分。行中的数据,你可以大致了解系统的CPU资源是如何被分配和使用的,进而判断是否存在CPU瓶颈或者I/O等待等问题。可以帮助识别系统中的I/O瓶颈,监控磁盘活动,并据此进行性能调优或问题诊断。在Linux系统中,

随便推点

Node+Vue毕设网上约会网站(程序+mysql+Express)-程序员宅基地

文章浏览阅读349次,点赞4次,收藏8次。随着网络技术的不断进步和社会节奏的加快,越来越多的单身人士倾向于通过在线渠道来结识新朋友或寻找潜在的伴侣,这一现象推动了网上约会网站的迅猛发展。本项目将采用HTML、CSS、JavaScript、Vue等前端技术结合Node.js、Express等后端技术,以及MySQL数据库,通过VSCode和Navicat等开发工具,构建一个功能完善、操作简便的网上约会网站,旨在为现代单身人士提供一个优质的交友平台。此外,强大的网上约会网站还能促进社会交往方式的创新,推动经济增长,提升社会整体的社交网络水平。

ubuntu目录分析_ubuntu opt目录-程序员宅基地

文章浏览阅读2.1k次。在Ubuntu系统中,/usr目录是一个重要的目录,它包含了系统的用户程序和数据。这只是一些常见的文件夹,实际上还有更多的文件夹和子目录。比较重要的有/etc,存放系统配置,proc我对虚拟文件系统不太了解,/usr下各目录的解释。_ubuntu opt目录

集美大学2024年团体程序设计天梯赛模拟赛( H 创造花田的魔法) 思路清晰简单明了,有代码有思路_2024天梯模拟赛-程序员宅基地

文章浏览阅读479次,点赞10次,收藏8次。第一点题目分析完后我们得到:地图是n * m 的有湖泊L(当且只有它的周围8个方向都是湖泊L的时候种荷花S)山脉M (不种任何东西)青草块G 1.周围没有房屋H,有湖泊L,种水仙N 2.周围没有房屋H,没有湖泊L,种苍月草N房屋H (不种任何东西,且周围不能种花)第二点那么我们可以定义四个变量 L,M,G,H 来统计当前这个点周围有哪些这个点自己是湖泊,且周围湖泊L== 8 的话,种荷花S这个点是青草块 1、周围房屋H == 0 且有_2024天梯模拟赛

SSM+mysql智慧物业管理系统-计算机毕业设计源码22076_管理员,用户登录流程图-程序员宅基地

文章浏览阅读2.9k次,点赞12次,收藏29次。1、小区管理2、居民信息管理3、工作人员管理4、停车位管理5、小区安全管理6、门禁管理7、居民收费信息管理:固定类费用缴纳(根据条件查询,显示某住户的基本信息),小区中的居民会有一些相关的物业费信息,管理员可以对这些信息进行管理操作。8、居民付费信息管理:小区居民需要对自己要缴纳的费用进行提交,管理员则可以对这些交易记录进行管理工作,可以对其进行添加、删除、修改操作。9、保修管理:用户对自己要保修的部位进行在线保修.然后管理员在后台对提交的信息进行管理操作。10、业主投诉管理_管理员,用户登录流程图

Java 高级面试问题及答案(一)

多线程是指在程序中同时运行多个线程,而并发是指在多线程环境下,多个线程在同一个时间点上执行不同的任务。Java中的多线程可以通过继承Thread类或者实现Runnable接口来实现。并发编程需要考虑线程安全,避免竞态条件和死锁等问题。我在一个高并发的Web服务项目中使用了多线程。服务需要处理大量的请求,并且每个请求都需要执行时间密集型的任务。为了提高性能和响应速度,我将任务分配到不同的线程上,这样CPU可以并行处理这些任务,而不是在单个线程上顺序执行。

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources,这里不需要混淆,暂时关闭。学习记录,每天不停进步。

推荐文章

热门文章

相关标签