认证Bearer:从普遍性到高标准的安全认证

一、Bearer认证方式的概念和原理

Bearer认证方式是一种常见的授权验证方案,其核心在于使用访问令牌来验证用户身份。Bearer是OAuth2.0协议中一个基于令牌的认证机制,即使用令牌而不是密码来获取受保护的资源。

与其他类型的令牌相比,Bearer Token最直接的特征是令牌可以使用不同的数字证书加密,例如基于HTTPS的加密,因此Bearer Token能够提供更加全面的安全保护。

Bearer Token是OAuth2.0中最主要的一种令牌类型,流程如下:

+------------+                                +---------------+
 | Resource   |                                | Authorization |
 |  Server    | 1.  Request to access user      |     Server    |
 |            |     account                    |               |
 |            +------------------------------->|               |
 |            |                                |               |
 |            |                                |               |
 |            |                                |               |
 |            |                                |               |
 |            |     4.  Issue access token     |               |
 |            <-------------------------------+               |
 |            |                                |               |
 |            |    5.  Access Token             |               |
 |            |                                |               |
 |            |                                |               |
 |            |                                |               |
 |            |2.Deliver response with         |               |
 |            |  authorization server URL      |               |
 |            |  token                         |               |
 |            | |           |
 |            |                                  |           |
 |            |                                |               |
 +------------+                                +---------------+

Bearer Token通过使用访问令牌来验证用户的身份。这种验证方式由OAuth2.0所提供。

Bearer Token主要由以下两部分构成:

令牌:Bearer Token它是一组由服务器发放的字符串代码,同时其通常具有特定的过期时间。

授权:Bearer Token通过有效的网路验证,来确定令牌所有者使用该令牌可以访问哪些资源。

二、构建一个基于Bearer Token的验证机制

开发一个基于Bearer Token验证的机制需要以下步骤:

第一步、开发Server部分代码

const express = require('express');
const jwt = require('jsonwebtoken');
const { authenticate } = require('./middlewares/authenticate');

const app = express();

const port = process.ENV.PORT || 3000;

const user = [
  {
    id: 1,
    username: 'user1',
    password: 'password1'
  },
  {
    id: 2,
    username: 'user2',
    password: 'password2'
  }
];

app.use(express.json());

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.post('/login', (req, res) => {
  const { username, password } = req.body;

  const userFound = user.find(user => {
    return user.username === username && user.password === password;
  });

  if (userFound) {
    const token = jwt.sign(userFound, 'secretkey');
    res.json({ token });
  } else {
    res.status(401).json({ message: 'Invalid credentials' });
  }
});

app.get('/secret', authenticate, (req, res) => {
  res.json(req.user);
});

app.listen(port, () => {
  console.log(`Server started on port ${port}`);
});

第二步、开发authenticate中间件代码

const jwt = require('jsonwebtoken');

const authenticate = (req, res, next) => {
  const authHeader = req.headers.authorization;
  if (authHeader) {
    const token = authHeader.split(' ')[1];

    jwt.verify(token, 'secretkey', (err, user) => {
      if (err) {
        return res.status(401).json({ message: 'Invalid or expired token' });
      }

      req.user = user;
      next();
    });
  } else {
    res.status(401).json({ message: 'Token not found' });
  }
};

module.exports = { authenticate };

第三步、测试API

const request = require('supertest');
const app = require('../index');

const token = jwt.sign({ id: 1 }, 'secretkey');

describe('GET /secret', () => {
  it('Should return 401 if no token', async () => {
    const res = await request(app).get('/secret');
    expect(res.statusCode).toEqual(401);
    expect(res.body.message).toEqual('Token not found');
  });

  it('Should return 401 if invalid token', async () => {
    const res = await request(app)
      .get('/secret')
      .set('Authorization', 'Bearer ' + 'invalidtoken');
    expect(res.statusCode).toEqual(401);
    expect(res.body.message).toEqual('Invalid or expired token');
  });

  it('Should return 200 if valid token', async () => {
    const res = await request(app)
      .get('/secret')
      .set('Authorization', `Bearer ${token}`);
    expect(res.statusCode).toEqual(200);
  });
});

三、Bearer Token在实际场景中的应用

Bearer Token的应用非常广泛,在许多常见的API验证方案中都有采用,例如:

1、Google APIs

Google APIs使用OAuth2.0并基于JWT或OAuth2.0的Bearer Token进行访问令牌验证。

2、Stripe APIs

Stripe APIs也采用OAuth2.0并基于JWT或OAuth2.0的Bearer Token进行访问令牌验证,其借助于Authorization服务器以及Token服务器实现访问权限管理。

3、GitHub APIs

GitHub APIs采用OAuth2.0进行验证,并基于OAuth2.0的Bearer Token进行访问令牌验证。

通过以上案例可以看出,Bearer Token的应用非常广泛,并且在实际中大量被使用。Bearer Token可以帮助开发者构建简单、快速和安全的验证方案,同时其也是一种基于OAuth2.0的应用的好选择。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/287437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-23 13:07
下一篇 2024-12-23 13:07

相关推荐

  • 实现安全认证与访问控制:Spring Security 6教程

    在Web应用程序开发过程中,安全和访问控制是非常重要的方面。有很多种安全保护措施,其中Spring Security是目前在Java开发中广泛使用的一种安全框架,它提供了一套管理用…

    编程 2025-02-25
  • 掌握JWT Bearer认证,构建更安全的API

    在当今的互联网时代,越来越多的应用程序在实现用户认证和授权时选择使用JWT Bearer认证。如果您还不熟悉这个认证方式,这篇文章将介绍JWT Bearer的基本概念、工作原理和优…

    编程 2025-02-01
  • Cyrus-SASL:用于安全认证和基于安全的传输

    安全是网络通信的重要组成部分。随着互联网技术和网络通信的不断发展,安全威胁也在不断加强。考虑到这些问题,开发人员一直在开发新的技术来保护网络通信的安全性。其中一个关键问题是:如何在…

    编程 2024-12-15
  • Authorization: Bearer

    Authorization: Bearer是一种身份验证方式,常用于web开发中的API授权。Bearer代表持有者,即在授权过程中持有访问令牌的用户。 一、Bearer的定义与特…

    编程 2024-12-12
  • phpcms服务器安全认证错误的简单介绍

    本文目录一览: 1、显示服务安全认证失败 2、服务器安全认证错误 3、phpcms https 文件上传 4、phpcms哭死的心都有了,上传不了图片,怎么办,说服务器安全认证错误…

    编程 2024-12-11
  • 基于BasicAuth的安全认证

    一、什么是BasicAuth BasicAuth是一种简单的HTTP认证协议,它使用明文的用户名和密码来进行身份验证。在HTTP请求头中添加Authorization头信息,由服务…

    编程 2024-11-21

发表回复

登录后才能评论