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的一些关键概念和组成部分:
- 资源所有者(Resource Owner) :资源所有者是指拥有受保护资源的用户,例如一个社交媒体网站上的注册用户。
- 客户端(Client) :客户端是请求访问受保护资源的应用程序,如移动应用、Web应用或第三方服务。客户端需要获得授权来访问资源。
- 授权服务器(Authorization Server) :授权服务器是负责验证资源所有者的身份并颁发令牌(token)的服务器。它与认证服务器通常分开,但有时也可以合并在一起。
- 资源服务器(Resource Server) :资源服务器存储和托管受保护的资源,如用户照片或个人信息。资源服务器根据授权令牌来控制对资源的访问。
- 授权令牌(Access Token) :授权令牌是客户端用来访问受保护资源的凭证,通常具有有限的有效期。
- 授权代码(Authorization Code) :授权代码是一种临时凭证,由授权服务器颁发给客户端,用于交换访问令牌。
- 重定向URI(Redirect URI) :客户端将用户重定向到授权服务器,并在授权完成后,授权服务器将用户重定向回客户端的URI。这个URI是客户端提前注册的。
OAuth 2.0的授权流程通常包括以下步骤:
- 客户端向资源所有者请求授权,将用户重定向到授权服务器。
- 资源所有者授权客户端,并授权服务器返回一个授权代码或直接返回令牌。
- 客户端将授权代码交换为访问令牌,以便访问资源服务器。
- 客户端使用访问令牌来访问受保护资源。
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 端的应用。
授权时序图
简单介绍时序图的流程,如下:
- 用户选择通过百度账号登录开发者应用。
- 开发者应用发起授权码 Code 请求。
- 百度 OAuth 服务器展示授权页面给用户,用户登录并同意授权。
- 用户同意授权后,百度 OAuth 服务器会将页面跳转至开发者应用配置的回调地址,返回授权码 Code。
- 开发者应用发起 Code 换取 Access Token 请求。
- 百度 OAuth 服务器返回 Access Token 凭证。
HttpModule介绍
由于要在NestJS中请求百度的Api,所以我会用到HttpModule,主要是针对NestJS对Axios做了一些基础的封装。当然我们也可以直接在NestJS中使用Axios
,但这感觉不太专业。而且不支持NestJS内置的RxJS管道。所以有必要学习一下HttpModule
的使用方法。
- 首先需要安装依赖
css
$ npm i --save @nestjs/axios axios
- 异步配置依赖
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 {}
- 在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打下基础。