15 【登录鉴权】

15 【登录鉴权-Cookie】

1.什么是认证(Authentication)

  • 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就打卡成功)
  • 互联网中的认证:
    • 用户名密码登录
    • 邮箱发送登录链接
    • 手机号接收验证码
    • 只要你能收到邮箱/验证码,就默认你是账号的主人

2.什么是授权(Authorization)

  • 用户授予第三方应用访问该用户某些资源的权限
    • 你在安装手机应用的时候,APP 会询问是否允许授予权限(访问相册、地理位置等权限)
    • 你在访问微信小程序时,当登录时,小程序会询问是否允许授予权限(获取昵称、头像、地区、性别等个人信息)
  • 实现授权的方式有:cookiesessiontokenOAuth

3.什么是凭证(Credentials)

实现认证和授权的前提是需要一种媒介(证书) 来标记访问者的身份

在互联网应用中,一般网站(如掘金)会有两种模式,游客模式和登录模式。游客模式下,可以正常浏览网站上面的文章,一旦想要点赞/收藏/分享文章,就需要登录或者注册账号。当用户登录成功后,服务器会给该用户使用的浏览器颁发一个令牌(token),这个令牌用来表明你的身份,每次浏览器发送请求时会带上这个令牌,就可以使用游客模式下无法使用的功能。

4.什么是 Cookie

  • HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现
  • cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
属性 说明
name=value 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型。如果值为 Unicode 字符,需要为字符编码。如果值为二进制数据,则需要使用 BASE64 编码。
domain 指定 cookie 所属域名,默认是当前域名
path 指定 cookie 在哪个路径(路由)下生效,默认是 ‘/’。
如果设置为 /abc,则只有 /abc 下的路由可以访问到该 cookie,如:/abc/read。
maxAge cookie 失效的时间,单位秒。如果为整数,则该 cookie 在 maxAge 秒后失效。如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie 。如果为 0,表示删除该 cookie 。默认为 -1。- 比 expires 好用。
expires 过期时间,在设置的某个时间点后该 cookie 就会失效。
一般浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除
secure 该 cookie 是否仅被使用安全协议传输。安全协议有 HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
httpOnly 如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全

Cookie的特点

  1. cookie保存在浏览器本地,只要不过期关闭浏览器也会存在。
  2. 正常情况下cookie不加密,用户可轻松看到
  3. 用户可以删除或者禁用cookie
  4. cookie可以被篡改
  5. cookie可用于攻击
  6. cookie存储量很小,大小一般是4k
  7. 发送请求自动带上登录信息

5.Cookie的使用

  1. 安装
pnpm install cookie-parser --save
  1. 引入
const cookieParser=require("cookie-parser");
  1. 设置中间件
app.use(cookieParser());
  1. 设置cookie
res.cookie("name",'zhangsan',{
   maxAge: 1000*60*60, httpOnly: true});
//res.cookie(名称,值,{配置信息})
  1. 获取cookie
req.cookies.name;

下面是一个基础实例:

const express=require("express");
const cookieParser=require("cookie-parser");

var app=express();

//设置中间件
app.use(cookieParser());

app.get("/",function(req,res){
   
	res.send("首页");
});

//设置cookie
app.get("/set",function(req,res){
   
    //如果不进行任何设置,有效期默认为1个会话,浏览器关闭即失效
   // res.cookie('isLogin','true');
	res.cookie("userName",'张三',{
   maxAge: 1000*60*60, httpOnly: true});
	res.send("设置cookie成功");
});

//获取cookie
app.get("/get",function(req,res){
   
	console.log(req.cookies.userName);
	res.send("获取cookie成功,cookie为:"+ req.cookies.userName);
});

app.listen(8080);

当访问set路由后会设置cookie,当访问get路由后会获取到设置的cookie值。当然你也可以在其他页面继续获取当前cookie,以实现cookie共享。cookie和session都可以在网页的响应头看到set-cookie

6.关于cookie加密

cookie加密是让客户端用户无法的获取cookie明文信息,是数据安全的重要部分;一般的我们可以在保存cookie时对cookie信息进行加密,或者在res.cookie中对option对象的signed属性设置设置成true即可。

const express = require("express");
const cookieParser = require("cookie-parser");

var app = express();
app.use(cookieParser('secret'));//签名 (加密) 要指定miyao ,什么名字都星行,列如:"xiaoxuesheng"

app.get("/",function(req,res){
   
	res.send("主页");
});

//获取cookie
app.use(function(req,res,next){
   
	console.log(req.signedCookies.name);
	next();
});

//设置cookie
app.use(function(req,res,next){
   
	console.log(res.cookie("name","zhangsan",{
   httpOnly: true,maxAge: 200000,signed: 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当涉及到登录鉴权微服务的Java代码时,可以使用一些常见的框架和技术来实现。下面是一个示例代码,展示了一个基本的登录鉴权微服务的实现: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class AuthMicroserviceApplication { public static void main(String[] args) { SpringApplication.run(AuthMicroserviceApplication.class, args); } @PostMapping("/login") public String login(@RequestBody LoginRequest request) { // 在此处执行登录鉴权逻辑,比如验证用户名和密码等 // 如果鉴权成功,可以返回一个生成的访问令牌(access token) // 如果鉴权失败,可以返回相应的错误信息 return "Access token"; } // 定义一个登录请求的数据模型 static class LoginRequest { private String username; private String password; // 省略构造函数、getter和setter方法 @Override public String toString() { return "LoginRequest{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } } } ``` 在这个示例中,我们使用了Spring Boot框架来构建微服务,并使用了Spring Web模块来处理HTTP请求。`@RestController`注解表示这是一个REST控制器,用于处理登录请求。`@PostMapping`注解指定了处理POST请求的方法,即`login()`方法。 `LoginRequest`类用于表示登录请求的数据模型,其中包含了用户名和密码。在`login()`方法中,我们可以执行实际的登录鉴权逻辑,并根据鉴权结果返回相应的访问令牌或错误信息。 请注意,这只是一个简单的示例,实际的登录鉴权逻辑可能更加复杂,比如使用密码加密、与用户数据库交互等。此外,还可能需要使用一些安全框架或库来增加登录鉴权的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DSelegent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值