Web 常见的前后端鉴权方式
常用四种
- HTTP Basic Authentication
- session-cookie
- Token 验证
- OAuth (开放授权)
1. HTTP Basic Authentication
这种授权方式是浏览器遵守 http 协议实现的基本授权方式。
HTTP 协议进行通信的过程中,HTTP 协议定义了基本认证认证允许 HTTP 服务器对客户端进行用户身份证的方法。
认证过程
客户端向服务器请求数据,请求的内容可能是一个网页或者是一个 ajax 异步请求,此时,假设客户端尚未被验证,客户端提供如下请求至服务器:
Get /index.html HTTP/1.0
Host:www.google.com
服务器向客户端发送验证请求代码 401,服务器返回的数据大抵如下:
HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm=”google.com”
Content-Type: text/html
Content-Length: xxx
当符合 http1.0 或 1.1 规范的客户端(如 IE,FIREFOX)收到 401 返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
用户输入用户名和密码后,将用户名及密码以 BASE64 加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic d2FuZzp3YW5n //加密后的用户名和密码,浏览器自动操作
服务器收到上述请求信息后,将 Authorization 字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端
每个请求的头上都会附带上用户名和密码信息
注意
- 客户端未认证的时候,会弹出用户名密码输入框,这个时候请求时属于 pending 状态
- 这个时候其实服务当用户输入用户名密码的时候客户端会再次发送带 Authentication 头的请求。
- 加密方式简单,仅仅是 base64 加密,这种加密方式是可逆的。
- 在每个请求的头上都会附带上用户名和密码信息,这样在外网是很容易被嗅探器探测到的
登出
最有效的方式就是在注销操作的时候,专门在服务器设置一个专门的注销账号,当接收到的 Authentication 信息为注销用户名密码的时候就注销成功了。
而客户端在注销操作的时候,手动的的去修改请求头中的 Authentication,将他设置为服务器默认的注销账号和密码。
2. session-cookie
由于 http 请求时是无状态的,服务器正常情况下是不知道当前请求之前有没有来过。
这个时候我们如果要记录状态,就需要在服务器端创建一个会话(session),将同一个客户端的请求都维护在各自的会会话中,每当请求到达服务器端的时候,先去查一下该客户端有没有在服务器端创建 session,如果有则已经认证成功了,否则就没有认证。
认证过程
- 服务器在接受客户端首次访问时在服务器端创建 session,然后保存 session(我们可以将 session 保存在内存中,也可以保存在 redis 中,推荐使用后者),然后给这个 session 生成一个唯一的标识字符串,然后在响应头中种下这个唯一标识字符串 sid。
- 签名。这一步只是对 sid 进行加密处理,服务端会根据这个 secret 密钥进行解密。(非必需步骤)
- 浏览器中收到请求响应的时候会解析响应头,然后将 sid 保存在本地 cookie 中,浏览器在下次 http 请求的请求头中会带上该域名下的 cookie 信息
- 服务器在接受客户端请求时会去解析请求头 cookie 中的 sid,然后根据这个 sid 去找服务器端保存的该客户端的 session,然后判断该请求是否合法。
客户端支持 cookie,一般为浏览器
3. Token 验证
认证过程
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
4. OAuth(开放授权)
OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容
为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供 OAuth 认证服务的厂商有支付宝,QQ,微信。
以网页 QQ 授权为例
请求页面地址
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101047385&redirect_uri=https%3A%2F%2Fwww.douyu.com%2Fmember%2Foauth%2Fsignin%2Fqq&state=41619f00caece3e1e01dc18775b49e94&response_type=code&approval_prompt=force
decodeURIComponent
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=101047385&redirect_uri=https://www.douyu.com/member/oauth/signin/qq&state=41619f00caece3e1e01dc18775b49e94&response_type=code&approval_prompt=force
分析
https://graph.qq.com/oauth2.0/show
?which=Login
&display=pc
&client_id=101047385
&redirect_uri=https://www.douyu.com/member/oauth/signin/qq
&state=41619f00caece3e1e01dc18775b49e94
&response_type=code
&approval_prompt=force
常见参数
response_type ---> 返回类型
client_id ---> 第三方应用 id,由授权服务器(qq)在第三方应用提交时颁发给第三方应用。
redirect_uri ---> 登陆成功重定向页面
oauth_provider ---> 第三方授权提供方
state ---> 由第三方应用给出的随机码或者可以传递一些数
用户第三方登陆成功,并返回一个凭证(code) 这个用户凭证会附加在重定向的地址 redirect_uri 的后面。
https://passport.csdn.net/account/login?code=XXX&state=XXX
请求授权服务器授权获取用户资源信息。
经过第二部获取 code 后后面的工作就可以交给后台去处理的,和用户的交互就结束了。
接下来我的需要获取 Access Token,我们需要用他来向授权服务器获取用户信息等资源。 第三方应用后台通过第二步的凭证(code)向授权服务器请求 Access Token,这时候需要以下几个信息:
client_id ---> 标识第三方应用的 id,由授权服务器在第三方应用提交时颁发给第三方应用
client_secret ---> 第三方应用和授权服务器之间的安全凭证,由授权服务器在第三方应用提交时颁发给第三方应用
code 第一步中返回的用户凭证
redirect_uri 第一步生成用户凭证后跳转到第二步时的地址
state 由第三方应用给出的随机码
授权服务器同意授权后,返回一个资源访问的凭证(Access Token),第三方应用通过第四步的凭证(Access Token)向资源服务器请求相关资源,资源服务器验证凭证(Access Token)通过后,将第三方应用请求的资源返回。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: nvm NodeJS 版本管理软件
下一篇: TypeScript 常见问题
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论