【1】密码登录、SSH 密钥登录、JWT !?

好难!?

1、我的理解:

当你进行登录的时候,可以选择密码登录或者 SSH 密钥登录,然后你的用户名和密码就会传到服务器上,服务器通过比较来判断是否存在、是否正确;如果正确之后,就会发给你一个 JWT 。之后你在这个网页或者APP内的所有操作都通过这个 JWT 来判断你是否有权操作。JWT 可能会有时间限制,在这段时间内,如果你关掉网页再打开,就可以自动登录,不需要再输用户名和密码,如果超过这段时间,JWT就会失效,所以你需要重新输入用户名和密码来获取一个新的token。

JWT 主要用于网页或者APP的接口鉴权,你要使用什么功能,都需要进行鉴权,比如你打开一个购物网站,你想要查看商品、下单、检查订单等,每一步都需要请求接口的使用权。

【2】数据库里面为什么存的是 password_hash 而不是密码?

1、why?

为了防止数据库泄露,用户的密码会直接暴露。

如果直接存明文密码,每个人都能看到真实密码。

2、过程:

当你注册的时候,服务器会把你输入的密码按照一定的算法算出哈希值,然后把你的明文密码丢弃,把哈希值存入数据库。

当你登录的时候,它会拿着你的密码再算一遍哈希值,然后和数据库里所存的哈希值进行对比。如果是一样的,就密码正确。

整个过程中,数据库中以及服务器上都没有你的真实密码。

【3】不分离的项目怎么做鉴权?

前后端分离进行鉴权的方式是JWT。那不分离的项目怎么做鉴权呢?

1、过程:

他是用 session + cookie 来进行验证的。

当你登录的时候,服务器会验证你的密码。验证成功之后会生成一个编号。服务器会通过 cookie 把这个编号给浏览器。之后浏览器每次再请求的时候都会带着这个编号。服务器拿到这个编号之后,再进行对比,对比成功就返回。

【4】THHP方法:

GET/POST/PUT/DELETE:查、增、改、删

【5】RESTful 是什么?

RESTful 是一种接口的风格。

核心思想一:

URL是名词,表示一个东西。Restful 把服务器上的数据都看作一个一个的资源,看到URL就知道是什么东西。

核心思想二:

对这些资源的操作放到了HTTP方法里面(动作)。

核心思想三:

请求的结果直接用HTTP的标准状态码来表示。

核心思想四:

无状态。服务器不会记得你上一次干了什么,所以你在请求的时候需要带着自己的信息,比如JWT。

【6】API (前后端分离)

1、什么是接口?

两个程序之间约定好的沟通的方式。

前端向后端发送请求数据,后端响应返回特定格式的数据,都要经过接口。

2、为什么要有接口?

原因是前后端要进行分工。

前端主要负责浏览器的界面长什么样子,以及用户的交互。

后端主要负责处理业务逻辑、存取数据、安全校验。

中间要通过接口来实现。

这样的话,后端所有的业务逻辑只需要做一次,然后提供相应的接口。

所有的客户端、网页、APP、小程序等都可以通过接口来实现相应的功能。不需要每一个都重新写一遍。

前后端分离,独立开发,互不影响,只靠约定进行连接。

3、接口的作用是什么?

1 前后端分离,两部分独立开发,互不影响。

2 实现复用。后端只需要写一次,可以供多个客户端使用(网页、小程序、APP等)。

3 前端如果要使用接口的话,必须要经过鉴权,可以保证数据的安全。

4、怎么使用接口?

需要有URL地址、方法、请求的参数以及响应。

  1. URL 地址:说明你要操作什么资源。
  2. 方法:说明你要做什么操作。
  3. 请求参数:说明你要提交的内容。
  4. 响应:说明服务器返回的内容。

【7】curl 做什么的?

1、什么是 curl ?

Curl是一个命令行工具。可以利用这个工具通过URL向服务器传输数据。

它的核心功能是按照各种网络协议向服务器发送请求,得到响应。

2、为什么要有 curl ?

没有这个工具之前,想要测试一个网络请求只能通过浏览器,但是浏览器不能够看到细节。

有了这个工具之后,可以在没有图形化界面的服务器上使用。

3、具体可以用来做什么?

  • 可以用来调试API接口,发送数据,看它能返回什么。
  • 用这个工具可以直接绕过客户端来进行测试,来判断到底是客户端的问题还是服务器的问题。

别的还有一些功能,感觉现在不太用得到,回来再查吧。

【8】ping 命令和 nslookup 命令有什么不同??

首先,他们都能够根据域名去查IP地址。

但 nslookup 它只能问DNS服务器这个域名对应的IP是多少?它能够输出帮你查询的DNS服务器是什么,域名是什么,IP地址是什么。

Ping命令不但能够先查DNS,把域名翻译成IP地址,还能够测试网络通不通。

注意:Windows下默认只发4次就会停止,而 Linux下会一直发,直到你 Ctrl+C 停止。

通过他们可以查出是哪里出问题了:

如果用 nslookup 域名 能够查出 IP,但是 ping 域名 全都是超时,说明网络不通或者是服务器挂掉了。

注意:ping 通不代表网页能访问。ping 用的是 ICMP 协议,只证明”机器活着”,而网页走的是 HTTP(80/443 端口),有些服务器故意禁 ping 但网站正常开放——所以排查网站问题时,ping 只是辅助,curl -v 看到的信息更完整。

【9】Postman 模拟请求工具

Postman 模拟请求工具和 curl 的用途是一样的,都是API调试工具。只不过 Postman 是带有图形界面的。能够向服务器发送请求,得到响应。

【10】Chrome 控制台学会查看网络请求

看懂请求列表:

Name:请求的文件名或者接口名。
Status:状态码。(200 成功)
Type:请求的类型。(Document网页、JS、CSS等等。)
Size:返回内容的大小。
Time:这个请求花了多长时间。

这些信息能说明什么?

了解即可。

  • 状态码:判断请求是否成功,首先要看状态码。200 成功;301/302 重定向;400 你发的数据格式不对;401 没登录/没权限;403 被禁止;404 地址不存在;500 服务器自己崩了

  • 如果列表里面某一个变红了,说明请求失败了,可以点进去查看状态码,看是什么原因。

  • Payload vs Response 对照看:判断”是我发错了还是服务器回错了”——发的数据对、回的数据错,是后端问题;发的就错,是前端问题

  • Time / Timing:找出页面慢的原因。某个请求花 5 秒?看它卡在哪个阶段

  • Size:图片太大、JS 文件几兆?这就是页面加载慢的原因

  • Request Headers:确认 token、Cookie 有没有正确带上(接口报 401 时先查这个)

???????这个cookie是什么意思???

【11】鉴权(JWT)

JWT 是一串加密的身份通行字符串。

你在某一个网站用用户名和密码登录之后,服务器就会发给你一个通行证,后续的一系列请求,只需要提供这个通行证,服务器就知道你是谁,不需要再重复进行登录。

JWT 令牌固定由3部分组成,中间用点隔开。分别是:头部.载荷.签名

头部和载荷都没有加密,签名是加密的。所以头部和载荷可以直接解码,签名是用来判断有没有被人修改的。

头部主要是表明用什么算法来进行签名,以及类型是什么。

1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

解码后的载荷数据主要是用来存放个人信息,比如用户ID、用户名、是否是管理员以及其它一些。

1
2
3
4
5
6
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}

签名是通过头部加上载荷部分,再加上服务器才知道的一个密钥,经过算法算出来的,这个才是密码锁。

【12】Request Headers:确认 token、Cookie 有没有正确带上(接口报 401 时先查这个)?

1、Cookie 是什么?

Cookie是服务器让浏览器带的一小段文本内容,存好之后,浏览器每次访问服务器都会自动把他带上,服务器看到之后,就知道它已经访问过一次了。

2、为什么要有cookie?

HTTP 无状态,服务器记不住你是谁。你刚登录完之后,下一秒访问一个内容,服务器可能就不知道你是谁了。Cookie 就是为了解决这个问题。

是一种浏览器自动携带数据的机制。

3、Cookie的功能:

  • 保持登录状态

  • 记住偏好设置,比如深色模式、语言选择等。

  • 还有广告追踪。

4、Cookie的特性:

  • 有有效期,服务器发的时候就会指定一个有效期,过了这个有效期之后登录就会失效。
  • 可以按照域名进行隔离。
  • 有安全属性,具体的话自己查吧!!??

【13】localStorage 是什么

localStorage 是浏览器自带的小仓库,浏览器会给每一个网页都分一个储物柜,每个网页都是独立的,存进去的东西是存到硬盘里的。也就是说,关掉网页和重启电脑都不会丢掉。

浏览器不会管它,它主要是通过JS取出来的。

【14】对比:

Cookie 路线(传统):

点按钮 → 浏览器发请求时自动把 Cookie 塞进去 → 服务器看 Cookie 里的 session_id(前端程序员:什么都没写)

localStorage + JWT 路线(现代前后端分离):

点按钮 → JS 代码从 localStorage 取出 JWT

→ JS 代码把 JWT 塞进 Authorization 头
→ 发出请求 → 服务器验 JWT
(前端程序员:写了取 token、塞 header 的逻辑,通常封装在请求工具里)

【15】gh 使用

1
2
# 关联GitHub账号
gh auth login

接着就按提示进行选择:

选择网页版账号 GitHub.com

比较推荐用HTTPS协议???!!!why???

授权网址:https://github.com/login/device

验证:

1
2
3
4
5
6
7
8
gh auth status    # 查看仓库状态
gh repo list # 查看仓库列表

# 用 gh 克隆
gh repo clone 用户名/仓库名

# 用传统git方式拉取
git clone https://github.com/用户名/仓库名.git

【16】关闭 WireGuard 代理的方法:

临时关闭:

1
wg-quick down wg0

打开:

1
wg-quick up wg0

确认是否已关闭:

1
2
wg show           # 没有任何输出说明已关闭
curl ifconfig.me # 显示的 IP 变回你原来的 IP,说明流量不再走代理

【17】连接数据库

SQL语句一定要记得加分号!!!

1
2
3
4
5
6
7
8
9
10
11
# 连接数据库
mysql -u inkwell -p inkwell_blog

# 查看数据库密码:
grep DB_PASSWORD /root/inkwell-blog/backend/.env

# 查看数据库中有哪些表
SHOW TABLES;

# 数据库SQL语句:
SELECT id, username, email FROM users;

可以查看有哪些客户端正在连接着数据库,都在干嘛

1
2
3
4
SHOW PROCESSLIST;

# 一次执行模式,执行完直接退出
mysql -u root -e "SHOW PROCESSLIST;"

查出来的具体含义:

  • User:谁连的(哪个 MySQL 账号)
  • Host:从哪台机器连过来的
  • db:正在用哪个库
  • Command:正在干什么——Sleep 表示连着但闲着没事干,Query 表示正在执行 SQL
  • Time:这个状态持续了多少秒
  • Info:正在执行的具体 SQL 语句