认证流程【3】-http_callback_404函数

6 篇文章 0 订阅
6 篇文章 0 订阅
场景:
连上了一个路由器(等同于这里的网关),这个路由器有wifigdog,并且绑定到了无线的interface 上,然后我们第一次上网,输入url: www.baidu.com

http_callback_404函数
1/ 上述场景中的url 请求通过lihttpd 记录下来
2/ 判断认证服务器是否可达
3/ 把客户端的浏览器重定向到认证服务器:  http://auth_server/login/?gw_id=xxx&gw_address=xxx&gw_port=xxx&url=www.baidu.com
4/ 网关就是等待认证服务器重定向客户端浏览器 http://gatewayip:gatewayport/wifidog/auth?token=xxx ,
      token是认证服务器生成的,用来标识唯一客户端
5/ 浏览器重新访问网关,网关调用auth 的回调函数:http_callback_auth
      这个函数就是拿着客户端浏览器发送的token 去认证服务器上核对token 的过程
uint64_t UserAuthService::AuthWidget(int32_t apiVersion, const AuthParam &authParam, const WidgetParam &widgetParam, sptr<UserAuthCallbackInterface> &callback) { IAM_LOGI("start"); auto contextCallback = GetAuthContextCallback(authParam.challenge, authParam.authTrustLevel, callback); if (contextCallback == nullptr) { IAM_LOGE("contextCallback is nullptr"); return BAD_CONTEXT_ID; } Attributes extraInfo; ResultCode checkRet = CheckWidgetNorthPermission(authParam.authType, authParam.authTrustLevel); if (checkRet != SUCCESS) { IAM_LOGE("CheckNorthPermission failed. errCode: %{public}d", checkRet); contextCallback->OnResult(checkRet, extraInfo); return BAD_CONTEXT_ID; } int32_t userId; if (IpcCommon::GetCallingUserId(*this, userId) != SUCCESS) { IAM_LOGE("get callingUserId failed"); contextCallback->OnResult(ResultCode::GENERAL_ERROR, extraInfo); return BAD_CONTEXT_ID; } contextCallback->SetTraceUserId(userId); if (authParam.authTrustLevel != ATL1 && authParam.authTrustLevel != ATL2 && authParam.authTrustLevel != ATL3 && authParam.authTrustLevel != ATL4) { IAM_LOGE("authTrustLevel is not in correct range"); contextCallback->OnResult(ResultCode::TRUST_LEVEL_NOT_SUPPORT, extraInfo); return BAD_CONTEXT_ID; } if (!CheckValidSolution(userId, authParam.authType, authParam.authTrustLevel)) { IAM_LOGE("no valid solution, userId:%{public}d", userId); contextCallback->OnResult(ResultCode::NOT_ENROLLED, extraInfo); // return BAD_CONTEXT_ID; } ContextFactory::AuthWidgetContextPara para; InitWidgetContextParam(userId, authParam, widgetParam, para); auto context = ContextFactory::CreateWidgetContext(para, contextCallback, userId, para.tokenId); const int32_t retryTimes = 3; if (!Insert2ContextPool(context, retryTimes)) { IAM_LOGE("insert context to pool failed, retry %{public}d times", retryTimes); contextCallback->OnResult(ResultCode::GENERAL_ERROR, extraInfo); return BAD_CONTEXT_ID; } contextCallback->SetCleaner(ContextHelper::Cleaner(context)); if (!context->Start()) { int32_t errorCode = context->GetLatestError(); IAM_LOGE("failed to start auth apiVersion:%{public}d errorCode:%{public}d", apiVersion, errorCode); contextCallback->OnResult(errorCode, extraInfo); return BAD_CONTEXT_ID; } return context->GetContextId(); }代码解析
07-08
这是一个名为UserAuthService的类的成员函数AuthWidget的实现代码。它接受一些参数,执行一系列操作,并返回一个uint64_t类型的值。 函数开始时打印日志"start"。 接下来,它调用GetAuthContextCallback函数,将authParam.challenge、authParam.authTrustLevel和callback作为参数传递进去,获取一个contextCallback对象。如果获取的contextCallback为空指针,则打印日志"contextCallback is nullptr"并返回BAD_CONTEXT_ID。 然后,定义了一个名为extraInfo的Attributes对象,并调用CheckWidgetNorthPermission函数检查widget的北向权限(authParam.authType和authParam.authTrustLevel作为参数传递进去)。如果检查不通过,则打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。 接下来,使用IpcCommon::GetCallingUserId函数获取调用者的用户ID,并将其存储在userId变量中。如果获取失败,则打印日志"get callingUserId failed",通过contextCallback对象调用OnResult函数,传递GENERAL_ERROR错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。 然后,通过contextCallback对象调用SetTraceUserId函数,将userId作为参数传递进去。 接着,在一系列if语句中,检查authParam.authTrustLevel是否在正确的范围内。如果不在范围内,则打印日志"authTrustLevel is not in correct range",通过contextCallback对象调用OnResult函数,传递TRUST_LEVEL_NOT_SUPPORT错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。 接下来,调用CheckValidSolution函数检查是否存在有效的解决方案,传递userId、authParam.authType和authParam.authTrustLevel作为参数。如果不存在有效的解决方案,则打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递NOT_ENROLLED错误代码和extraInfo对象作为参数。 然后,定义了一个名为para的ContextFactory::AuthWidgetContextPara对象,并调用InitWidgetContextParam函数初始化para对象,将userId、authParam、widgetParam和para作为参数传递进去。 接着,通过ContextFactory::CreateWidgetContext函数创建一个context对象,传递para、contextCallback、userId和para.tokenId作为参数。 然后,定义了一个retryTimes变量,并将其设置为3。 接下来,通过Insert2ContextPool函数将context对象插入到context池中,传递context和retryTimes作为参数。如果插入失败,则打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递GENERAL_ERROR错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。 然后,通过contextCallback对象调用SetCleaner函数,将ContextHelper::Cleaner(context)作为参数传递进去。 最后,通过调用context对象的Start函数启动认证过程。如果启动失败,则获取最新的错误代码并打印相应的错误日志,并通过contextCallback对象调用OnResult函数,传递错误代码和extraInfo对象作为参数,并返回BAD_CONTEXT_ID。 如果启动成功,则返回context的上下文ID。 这段代码实现了一个用户认证的逻辑流程,并通过回调函数通知结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值