NestJS实战07-在NestJS中如何调用百度网盘API(上)

by 雪隐 from juejin.cn/user/143341...

本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权

概要

完成了当日任务和长期目标以后,接下来要做资料管理页面,我打算将我的资料放到百度网盘中管理,画面如下:

所以要用到百度网盘开放平台中的接口,如下图,百度网盘提供了很多文件相关的服务,其中,账号关联、文件管理、上传下载是免费使用 的,其他的接口都只能是免费试用,请大家使用的时候多注意。

百度网盘使用概述

开发者需要完成基本流程才能使用开放平台的各种能力以及服务,通用的操作流程如下图所示:

详情请参照官方文档,流程如下:

其中1,2,3百度网盘中有比较具体的说明,所以我就不介绍。当中比较重要的一点是创建应用以后获得生成AppID、AppKey、SecretKey、SignKey等关键信息才能使用网盘接口。

随后为了要使用百度网盘的接口,我会着重介绍网盘的接入授权相关的知识。

OAuth 2.0

百度网盘Api的授权是基于(OAuth 2.0)的,不仅是百度网盘还有诸如

OAuth 2.0(Open Authorization 2.0)是一种用于授权和认证的开放标准协议,旨在使第三方应用程序能够访问受保护的用户数据,而无需用户的凭证信息(例如用户名和密码)。OAuth 2.0通常用于互联网服务、社交媒体平台和其他应用程序之间的安全授权,以确保用户的数据和隐私得到保护。

以下是OAuth 2.0的一些关键概念和组成部分:

  1. 资源所有者(Resource Owner) :资源所有者是指拥有受保护资源的用户,例如一个社交媒体网站上的注册用户。
  2. 客户端(Client) :客户端是请求访问受保护资源的应用程序,如移动应用、Web应用或第三方服务。客户端需要获得授权来访问资源。
  3. 授权服务器(Authorization Server) :授权服务器是负责验证资源所有者的身份并颁发令牌(token)的服务器。它与认证服务器通常分开,但有时也可以合并在一起。
  4. 资源服务器(Resource Server) :资源服务器存储和托管受保护的资源,如用户照片或个人信息。资源服务器根据授权令牌来控制对资源的访问。
  5. 授权令牌(Access Token) :授权令牌是客户端用来访问受保护资源的凭证,通常具有有限的有效期。
  6. 授权代码(Authorization Code) :授权代码是一种临时凭证,由授权服务器颁发给客户端,用于交换访问令牌。
  7. 重定向URI(Redirect URI) :客户端将用户重定向到授权服务器,并在授权完成后,授权服务器将用户重定向回客户端的URI。这个URI是客户端提前注册的。

OAuth 2.0的授权流程通常包括以下步骤:

  1. 客户端向资源所有者请求授权,将用户重定向到授权服务器。
  2. 资源所有者授权客户端,并授权服务器返回一个授权代码或直接返回令牌。
  3. 客户端将授权代码交换为访问令牌,以便访问资源服务器。
  4. 客户端使用访问令牌来访问受保护资源。

OAuth 2.0支持不同类型的授权流程,包括授权码授权流、密码授权流、客户端凭据授权流和隐式授权流,具体流程取决于应用程序的需求和安全要求。

总之,OAuth 2.0是一种强大的授权协议,使应用程序能够安全地访问用户的数据,同时保护用户的隐私。它广泛用于互联网服务和应用程序之间的授权和认证,是许多现代应用程序的核心安全组件。

授权码模式(Authorization Code)

百度网盘的授权模式有3种,授权码模式(Authorization Code)简化模式(Implicit Grant)设备码模式(Device Code)

简化模式,比较适用于前端单独去请求网盘接口的情况,缺点是每次请求网盘接口都要先授权。设备码模式,它对于弱输入设备,不支持浏览器或输入受限的设备(如儿童手表),推荐使用设备码模式接入授权。而我将会使用授权码模式来授权。

授权码模式介绍

开发者应用在获取用户的授权码 Code 之后,通过 Code 换取 Access Token 凭证。

Access Token 有效期30天,过期后支持刷新,刷新后的 Access Token 有效期仍为 30 天,刷新Access Token请按需刷新,不需要不停的刷新。

刷新请求,如果API返回失败,旧的refresh_token会失效,此时需要重新发起授权请求,获取新的 Access Token、refresh_token,而不是使用旧的 refresh_token 循环再发起刷新请求。

refresh_token 只支持使用一次,refresh_token 使用后失效,下次刷新 Access Token 时需要使用上一次刷新请求响应中的 refresh_token。

获取到的授权码 code 有效期 10 分钟,且仅一次有效。

授权码模式适用于有 Server 端的应用。

授权时序图

简单介绍时序图的流程,如下:

  1. 用户选择通过百度账号登录开发者应用。
  2. 开发者应用发起授权码 Code 请求。
  3. 百度 OAuth 服务器展示授权页面给用户,用户登录并同意授权。
  4. 用户同意授权后,百度 OAuth 服务器会将页面跳转至开发者应用配置的回调地址,返回授权码 Code。
  5. 开发者应用发起 Code 换取 Access Token 请求。
  6. 百度 OAuth 服务器返回 Access Token 凭证。

HttpModule介绍

由于要在NestJS中请求百度的Api,所以我会用到HttpModule,主要是针对NestJS对Axios做了一些基础的封装。当然我们也可以直接在NestJS中使用Axios,但这感觉不太专业。而且不支持NestJS内置的RxJS管道。所以有必要学习一下HttpModule的使用方法。

  1. 首先需要安装依赖
css 复制代码
$ npm i --save @nestjs/axios axios
  1. 异步配置依赖
ts 复制代码
import { Module } from '@nestjs/common';
import { BaiduApiService } from './baidu-api.service';
import { BaiduApiController } from './baidu-api.controller';
import { CacheModule } from '@nestjs/cache-manager';
import { HttpModule } from '@nestjs/axios';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { ConfigEnum } from '../enum/config.enum';
@Module({
  imports: [
    CacheModule.register(),
    HttpModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        baseURL: configService.get(ConfigEnum.HTTP_CONFIG).BASE_URI,
        timeout: configService.get(ConfigEnum.HTTP_CONFIG).TIME_OUT,
        maxRedirects: configService.get(ConfigEnum.HTTP_CONFIG).MAX_REDIRECTS,
      }),
      inject: [ConfigService],
    }),
  ],
  controllers: [BaiduApiController],
  providers: [BaiduApiService],
})
export class BaiduApiModule {}
  1. 在Service中使用
ts 复制代码
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';

@Injectable()
export class BaiduApiService {

  constructor(
    private readonly httpService: HttpService,
  ) {}
  
  async test(): Promise<any> {
      const BAIDU_CONFOG = this.configService.get(ConfigEnum.BAIDU_CONFIG);
      const redirctUri = "http://any.xxxxxx"
      const url = `https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=${code}&client_id=${BAIDU_CONFOG.APP_KEY}&client_secret=${BAIDU_CONFOG.SECRET_KEY}&redirect_uri=${redirctUri}`;
      
      const result = await firstValueFrom(
        this.httpService
          .get(url)
          .pipe(map((response) => response.data))
          .pipe(
            catchError((error) => {
              this.logger.error(error);
              throw '获取百度网盘token失败!';
            }),
          ),
      );
      const { access_token, refresh_token, expires_in } = result;

      console.log(access_token, refresh_token, expires_in)
  }
}

总结

这一章介绍了百度网盘Api的相关的知识,还介绍了NestJS中的HttpModule,这些知识将会为下一章的接入百度网盘Api打下基础。

相关推荐
gqkmiss几秒前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃6 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰10 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye17 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm19 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
乐闻x1 小时前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚1 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
Amd7941 小时前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子
生椰拿铁You1 小时前
09 —— Webpack搭建开发环境
前端·webpack·node.js