如何推荐聊聊鉴权那些事,以长尾词形式呈现?

2026-04-08 20:531阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2599个文字,预计阅读时间需要11分钟。

如何推荐聊聊鉴权那些事,以长尾词形式呈现?

在系统级项目开发中,遇到的一个常见问题就是授权。作为前端开发人员,我们可能觉得离授权较远,但实际上我们可能比想象中更接近。一般而言,我们只会去应用层面,并没有对权限控制这部分进行深入理解。那么,授权究竟是什么呢?授权是指对系统资源的访问权限进行控制的过程。

在系统级项目开发时常常会遇到一个问题就是鉴权,身为一个前端来说可能我们距离鉴权可能比较远,一般来说我们也只是去应用,并没有对权限这一部分进行深入的理解。

什么是鉴权

鉴权:是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份。 -- 节选自百度百科

上述简单扼要的说明了一下鉴权的概念,但是这也只是简单的鉴权,也是项目中最最常见的及安全形式了,但是对于后端鉴权又是如何去做的,我们仍是一无所知,一般来说对于后端来说,鉴权最长见的方式分为三种:

  • Session/Cookie
  • Token或Jwt
  • OAuth

这种授权方式是浏览器遵守localhost:3000/,就可以看到hello cookie字样,这样的话就代表该服务已经启动了。若想查看到到我们所设置的Cookie,首先观察一下在NetworkResponse Headers中,可以看到我们所写的Set-Cookie属性,当我们访问localhost:3000/的时候,当浏览器接收到Set-Cookie这个属性的时候,浏览器会根据其内部约定,并在其浏览器内部对其cookie进行存储,打开浏览器控制台,在Application中找到Cookies中找到相对应的域名,就可以看到我们所设置的cookie值了。当在同域的情况下,当再次请求数据的时候浏览器会默认发送cookie在该请求中,一起发送给后端。为了证实上面的说法,刷新一下localhost:3000/页面,在控制台Network找到Request Headers中可以看到Cookie: cx=Segmentfault属性,既然发送给服务端之后,相应的在后端也是可以接收到该Cookie的,修改一下上面的例子:

const Http = require("img.558idc.com/uploadfile/allimg/210405/23324B200-2.jpg"></script> <script src="img.558idc.com/uploadfile/allimg/210405/2332463427-3.jpg"></script> <title>Document</title> </head> <body> <div id="app"> <div> <input type="text" v-model="username"> <input type="text" v-model="passwrold"> </div> <div> <button @click="login">登陆</button> <button @click="loginOut">退出</button> <button @click="getUserInfo">获取用户信息</button> </div> <div> <button @click="logs = []">清空日志</button> </div> <ul> <li v-for="(item,index) of logs" :key="index">{{item}}</li> </ul> </div> <script> axios.defaults.baseURL = "localhost:3000" // 请求拦截 axios.interceptors.request.use((config) => { const token = localStorage.getItem("token"); if(token){ // 判断是否存在token,如果存在的话 // 每次发起HTTP请求时在headers中添加token // Bearer是JWT的认证头部信息 config.headers["Authorization"] = `Bearer ${token}` } return config; },error => alert(error)); // 响应拦截 axios.interceptors.response.use((res) => { app.logs.push(JSON.stringify(res.data)) return res; },error => alert(error)); const app = new Vue({ el:"#app", data:{ username:"", passwrold:"", logs:[] }, methods:{ login() { let {username,passwrold} = this; axios.post("/users/login/token",{ username,passwrold }).then((res) => { localStorage.setItem("token",res.data.token) }) }, loginOut(){ axios.post("/users/logout").then((res) => { localStorage.removeItem("token") }) }, getUserInfo(){ axios.get("/users/get/user/info").then((res) => { console.log(res) }); } } }) </script> </body> </html>

后端:

const Koa = require("koa"); const jwt = require("jsonwebtoken"); const jwtAuth = require("koa-jwt"); const Router = require('koa-router'); // koa 路由中间件 const bodyParser = require("koa-bodyparser"); const cors = require("koa2-cors"); const app = new Koa(); const router = new Router(); // 密钥 const secret = "this is a secret"; app.use(bodyParser()); app.use(cors()); router.post("/users/login/token",(ctx) => { const {body} = ctx.request; const {username} = body; ctx.body = { code:1, message:"登陆成功", body:{ username }, token:jwt.sign({ data:body, exp:Math.floor(Date.now() / 1000) + 60 * 60, },secret) } }); router.post("/users/logout",(ctx) => { const {body} = ctx.request; ctx.body = { code:1, message:"退出成功" } }) router.get("/users/get/user/info",jwtAuth({secret}),(ctx) => { // jwtAuth token参数 console.log(ctx.state.user.data) ctx.body = { code:1, message:"成功", data:ctx.state.user.data } }) app.use(router.routes()); app.listen(3000);

上面代码用到了很多的依赖模块,最关键的的是jsonwebtokenkoa-jwt,这两个模块一个是用来对token进行加密,一个是用来对数据进行解密的,同时在每次访问需要保护的路由的时候需要使用jwtAuth对其进行拦截处理,jwtAuth会根据其secret进行数据解密,把解密的数据存放到ctx.state中,供用户读取。

有关jwt相关请查看深入理解令牌认证机制详细的解释了其加密后数据token的构成。

加密后的数据主要分为三个部分机密头部、载荷、数据如果我们想查看其加密前内容是什么样子的,可以通过base64对其没一部分进行解密。

  • 机密头部:声明加密规则,可反解
  • 载荷:数据信息,也就是我们需要加密的信息,可反解
  • 验证:这部分是对前两部分使用hash算法的摘要,是不可逆的

在使用jsonwebtoken时需要注意的是,由于加密信息是可以反解的所以,尽量不要在加密数据中存放敏感信息,比如用户的密码,用户私密信息等等(千万不要效仿Dome,这是不对的O(∩_∩)O)。同过上面所述,所传递给前端的token一旦发生变化,仅仅是一个字母大小写发生变化也是不行的,当服务端接收到token解密时,是无法正确解密的,这种token可以是发篡改的。如果想要篡改token必须要有其secret才可以对其进行篡改和伪造。

OAuth

OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容,为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供OAuth认证服务的厂商有支付宝,QQ,微信

OAuth协议又有1.02.0两个版本。相比较1.0版,2.0版整个授权验证流程更简单更安全,也是目前最主要的用户身份验证和授权方式。

OAuth认证主要经历了如下几步:

  • 需要第三方应用存储资源所有者的凭据,以供将来使用,通常是明文密码。
  • 需要服务器支持密码身份认证,尽管密码认证天生就有安全缺陷。
  • 第三方应用获得的资源所有者的受保护资源的访问权限过于宽泛,从而导致资源所有者失去对资源使用时限或使用范围的控制。
  • 资源所有者不能仅撤销某个第三方的访问权限而不影响其它,并且,资源所有者只有通过改变第三方的密码,才能单独撤销这第三方的访问权限。
  • 与任何第三方应用的让步导致对终端用户的密码及该密码所保护的所有数据的让步。

简单概括,就是用于第三方在用户授权下调取平台对外开放接口获取用户相关信息。OAuth引入了一个授权环节来解决上述问题。第三方应用请求访问受保护资源时,资源服务器在获准资源用户授权后,会向第三方应用颁发一个访问令牌(AccessToken)。该访问令牌包含资源用户的授权访问范围、授权有效期等关键属性。第三方应用在后续资源访问过程中需要一直持有该令牌,直到用户主动结束该次授权或者令牌自动过期。

如何推荐聊聊鉴权那些事,以长尾词形式呈现?

总结

授权方式多种多样,主要还是要取决于我们对于产品的定位。如果我们的产品只是在企业内部使用,tokensession就可以满足我们的需求,现在前后端分离如此火热jwt认证方式更加适合。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计2599个文字,预计阅读时间需要11分钟。

如何推荐聊聊鉴权那些事,以长尾词形式呈现?

在系统级项目开发中,遇到的一个常见问题就是授权。作为前端开发人员,我们可能觉得离授权较远,但实际上我们可能比想象中更接近。一般而言,我们只会去应用层面,并没有对权限控制这部分进行深入理解。那么,授权究竟是什么呢?授权是指对系统资源的访问权限进行控制的过程。

在系统级项目开发时常常会遇到一个问题就是鉴权,身为一个前端来说可能我们距离鉴权可能比较远,一般来说我们也只是去应用,并没有对权限这一部分进行深入的理解。

什么是鉴权

鉴权:是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份。 -- 节选自百度百科

上述简单扼要的说明了一下鉴权的概念,但是这也只是简单的鉴权,也是项目中最最常见的及安全形式了,但是对于后端鉴权又是如何去做的,我们仍是一无所知,一般来说对于后端来说,鉴权最长见的方式分为三种:

  • Session/Cookie
  • Token或Jwt
  • OAuth

这种授权方式是浏览器遵守localhost:3000/,就可以看到hello cookie字样,这样的话就代表该服务已经启动了。若想查看到到我们所设置的Cookie,首先观察一下在NetworkResponse Headers中,可以看到我们所写的Set-Cookie属性,当我们访问localhost:3000/的时候,当浏览器接收到Set-Cookie这个属性的时候,浏览器会根据其内部约定,并在其浏览器内部对其cookie进行存储,打开浏览器控制台,在Application中找到Cookies中找到相对应的域名,就可以看到我们所设置的cookie值了。当在同域的情况下,当再次请求数据的时候浏览器会默认发送cookie在该请求中,一起发送给后端。为了证实上面的说法,刷新一下localhost:3000/页面,在控制台Network找到Request Headers中可以看到Cookie: cx=Segmentfault属性,既然发送给服务端之后,相应的在后端也是可以接收到该Cookie的,修改一下上面的例子:

const Http = require("img.558idc.com/uploadfile/allimg/210405/23324B200-2.jpg"></script> <script src="img.558idc.com/uploadfile/allimg/210405/2332463427-3.jpg"></script> <title>Document</title> </head> <body> <div id="app"> <div> <input type="text" v-model="username"> <input type="text" v-model="passwrold"> </div> <div> <button @click="login">登陆</button> <button @click="loginOut">退出</button> <button @click="getUserInfo">获取用户信息</button> </div> <div> <button @click="logs = []">清空日志</button> </div> <ul> <li v-for="(item,index) of logs" :key="index">{{item}}</li> </ul> </div> <script> axios.defaults.baseURL = "localhost:3000" // 请求拦截 axios.interceptors.request.use((config) => { const token = localStorage.getItem("token"); if(token){ // 判断是否存在token,如果存在的话 // 每次发起HTTP请求时在headers中添加token // Bearer是JWT的认证头部信息 config.headers["Authorization"] = `Bearer ${token}` } return config; },error => alert(error)); // 响应拦截 axios.interceptors.response.use((res) => { app.logs.push(JSON.stringify(res.data)) return res; },error => alert(error)); const app = new Vue({ el:"#app", data:{ username:"", passwrold:"", logs:[] }, methods:{ login() { let {username,passwrold} = this; axios.post("/users/login/token",{ username,passwrold }).then((res) => { localStorage.setItem("token",res.data.token) }) }, loginOut(){ axios.post("/users/logout").then((res) => { localStorage.removeItem("token") }) }, getUserInfo(){ axios.get("/users/get/user/info").then((res) => { console.log(res) }); } } }) </script> </body> </html>

后端:

const Koa = require("koa"); const jwt = require("jsonwebtoken"); const jwtAuth = require("koa-jwt"); const Router = require('koa-router'); // koa 路由中间件 const bodyParser = require("koa-bodyparser"); const cors = require("koa2-cors"); const app = new Koa(); const router = new Router(); // 密钥 const secret = "this is a secret"; app.use(bodyParser()); app.use(cors()); router.post("/users/login/token",(ctx) => { const {body} = ctx.request; const {username} = body; ctx.body = { code:1, message:"登陆成功", body:{ username }, token:jwt.sign({ data:body, exp:Math.floor(Date.now() / 1000) + 60 * 60, },secret) } }); router.post("/users/logout",(ctx) => { const {body} = ctx.request; ctx.body = { code:1, message:"退出成功" } }) router.get("/users/get/user/info",jwtAuth({secret}),(ctx) => { // jwtAuth token参数 console.log(ctx.state.user.data) ctx.body = { code:1, message:"成功", data:ctx.state.user.data } }) app.use(router.routes()); app.listen(3000);

上面代码用到了很多的依赖模块,最关键的的是jsonwebtokenkoa-jwt,这两个模块一个是用来对token进行加密,一个是用来对数据进行解密的,同时在每次访问需要保护的路由的时候需要使用jwtAuth对其进行拦截处理,jwtAuth会根据其secret进行数据解密,把解密的数据存放到ctx.state中,供用户读取。

有关jwt相关请查看深入理解令牌认证机制详细的解释了其加密后数据token的构成。

加密后的数据主要分为三个部分机密头部、载荷、数据如果我们想查看其加密前内容是什么样子的,可以通过base64对其没一部分进行解密。

  • 机密头部:声明加密规则,可反解
  • 载荷:数据信息,也就是我们需要加密的信息,可反解
  • 验证:这部分是对前两部分使用hash算法的摘要,是不可逆的

在使用jsonwebtoken时需要注意的是,由于加密信息是可以反解的所以,尽量不要在加密数据中存放敏感信息,比如用户的密码,用户私密信息等等(千万不要效仿Dome,这是不对的O(∩_∩)O)。同过上面所述,所传递给前端的token一旦发生变化,仅仅是一个字母大小写发生变化也是不行的,当服务端接收到token解密时,是无法正确解密的,这种token可以是发篡改的。如果想要篡改token必须要有其secret才可以对其进行篡改和伪造。

OAuth

OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容,为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供OAuth认证服务的厂商有支付宝,QQ,微信

OAuth协议又有1.02.0两个版本。相比较1.0版,2.0版整个授权验证流程更简单更安全,也是目前最主要的用户身份验证和授权方式。

OAuth认证主要经历了如下几步:

  • 需要第三方应用存储资源所有者的凭据,以供将来使用,通常是明文密码。
  • 需要服务器支持密码身份认证,尽管密码认证天生就有安全缺陷。
  • 第三方应用获得的资源所有者的受保护资源的访问权限过于宽泛,从而导致资源所有者失去对资源使用时限或使用范围的控制。
  • 资源所有者不能仅撤销某个第三方的访问权限而不影响其它,并且,资源所有者只有通过改变第三方的密码,才能单独撤销这第三方的访问权限。
  • 与任何第三方应用的让步导致对终端用户的密码及该密码所保护的所有数据的让步。

简单概括,就是用于第三方在用户授权下调取平台对外开放接口获取用户相关信息。OAuth引入了一个授权环节来解决上述问题。第三方应用请求访问受保护资源时,资源服务器在获准资源用户授权后,会向第三方应用颁发一个访问令牌(AccessToken)。该访问令牌包含资源用户的授权访问范围、授权有效期等关键属性。第三方应用在后续资源访问过程中需要一直持有该令牌,直到用户主动结束该次授权或者令牌自动过期。

如何推荐聊聊鉴权那些事,以长尾词形式呈现?

总结

授权方式多种多样,主要还是要取决于我们对于产品的定位。如果我们的产品只是在企业内部使用,tokensession就可以满足我们的需求,现在前后端分离如此火热jwt认证方式更加适合。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。