鸿蒙模块一trans_service目录下auth_conn_manager.c和auth_conn_manager.h文件解析
其中trans_service目录主要负责设备的身份验证和传输通道,提供设备认证机制。而auth机制在设备认证和用户权限验证中发挥着重要的作用。
auth机制原理图一 auth机制是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。
使用场景: 用户不再需要注册大量账号 用于单点登录 用于分布式系统的权限控制
运行流程
运行流程:
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
四种授权模式
- 授权码
(1)用户访问客户端,后者将前者导向认证服务器,假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(2)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接。请求成功返回code授权码,一般有效时间是10分钟。
(3)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接。请求成功返回access Token和refresh Token。
- 简化模式
适用于公开的浏览器单页应用
Access Token直接从授权服务器返回(只有前端渠道)
不支持refresh tokens
假定资源所有者和公开客户应用在同一个设备上
最容易受安全攻击
- 用户名密码
使用用户名密码登录的应用,例如桌面App
使用用户名/密码作为授权方式从授权服务器上获取access token
一般不支持refresh token
假定资源拥有者和公开客户子啊相同设备上
- 客户端凭证
适用于服务器见通信场景,机密客户代表它自己或者一个用户
只有后端渠道,使用客户凭证获取一个access token
因为客户凭证可以使用对称或者非对称加密,该方式支持共享密码或者证书
代码部分: auth_conn_manager.h内容 (路径:模块一\communication_softbus_lite-master\trans_service\include\libdistbus\auth_conn_manager.h)
#ifndef AUTH_CONN_MANAGER_H
#define AUTH_CONN_MANAGER_H
/// 这里使用条件编译,减少编译的工程量。加快共同调用时候的编译速度
#include "bus_manager.h"
int StartListener(BaseListener* callback, const char *ip);
void StopListener(void);
void CloseAuthSessionFd(int fd);
///添加三个函数定义声明,便于auth_conn_manager.c直接调用函数
#endif // AUTH_CONN_MANAGER_H
/// 使用宏定义来编辑头文件,加快执行效率
由于头文件有关于多种变量以及函数的声明,故在源文件包含的时候,容易造成多重包含,引起变量和函数的重复声明和定义。头文件一般选用条件编译的格式可以避免多个c文件共同调用同一个头文件时候重复编译。
auth_conn_manager.c头文件内容 (路径:模块一\communication_softbus_lite- master\trans_service\source\libdistbus\auth_conn_manager.c)
#include "auth_conn_manager.h"
#include
// defined()函数检查某常量是否存在,若存在则返回true,否则返回false
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
/// 前者是基于鸿蒙内核LITEOS_M,后者是基于RISC-V的现有内核
/*这个条件编译检查__LITEOS_M__和__LITEOS_RISCV__是否存在,如果存在则调用else之前的头文件否则调用else和endif之间的头文件*/
#include
#include
#else
#include
#include
#include
#include
#include
#endif
/* 前面使用条件编译*/
#include
#include
#include
#include
#include
#include
#include "data_bus_error.h"
#include "os_adapter.h"
#include "tcp_socket.h"
#define DEFAULT_BACKLOG 4
#define SESSIONPORT 0
/* 定义默认返回日志为4,和服务器端口为0*/
BaseListener *g_callback = NULL;
static int g_listenFd = -1;
static int g_dataFd = -1;
static int g_maxFd = -1;
/*初始化部分变量*/
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
static osThreadId_t g_uwTskLoID;
#endif
/*这里同上面使用条件编译,检查__LITEOS_M__和__LITEOS_RISCV__是否存在,如果存在则调用else之前的内容,否则调用else和endif之间的内容*/