@ -1,6 +1,8 @@
using Common.Shared.Application.DaHua ;
using Microsoft.Extensions.Configuration ;
using Microsoft.Extensions.Logging ;
using MongoDB.Bson ;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis ;
using Org.BouncyCastle.Crypto.Parameters ;
using Org.BouncyCastle.Security ;
using System.Net.Http.Json ;
@ -34,12 +36,18 @@ namespace Common.Shared.DomainService
public async Task < string > GetTokenAsync ( string clientId )
{
if ( TokenCache . TokenMap . TryGetValue ( clientId , out var tokenEntry )
& & tokenEntry . ExpireAt > DateTimeOffset . UtcNow . AddMinutes ( 5 ) )
& & tokenEntry . ExpireAt > DateTimeOffset . UtcNow . AddMinutes ( 1 ) )
{
if ( ! IsTokenValid ( tokenEntry . AccessToken ! ) )
{
_l ogger . LogWarning ( "从字典里匹配" ) ;
return tokenEntry . AccessToken ! ;
}
}
var tokenLock = TokenLockProvider . GetLock ( clientId ) ;
_l ogger . LogWarning ( "枷锁" ) ;
await tokenLock . WaitAsync ( ) ;
try
{
@ -47,8 +55,13 @@ namespace Common.Shared.DomainService
if ( TokenCache . TokenMap . TryGetValue ( clientId , out tokenEntry )
& & tokenEntry . ExpireAt > DateTimeOffset . UtcNow . AddMinutes ( 5 ) )
{
if ( ! IsTokenValid ( tokenEntry . AccessToken ! ) )
{
_l ogger . LogWarning ( "再次匹配" ) ;
return tokenEntry . AccessToken ! ;
}
}
var refreshed = await TryRefreshOrLoginAsync ( clientId , tokenEntry ) ;
@ -137,7 +150,8 @@ namespace Common.Shared.DomainService
dto . ClientSecret = _ configuration [ "DahuaAuth:ClientSecret" ] ! ;
dto . Password = _ configuration [ "DahuaAuth:Password" ] ! ;
dto . Username = _ configuration [ "DahuaAuth:Username" ] ! ;
_l ogger . LogWarning ( "在GetDaHToken方法中的记录:Dahua Host = {Host}, ClientId = {ClientId}" ,
_ configuration [ "DahuaAuth:Host" ] , _ configuration [ "DahuaAuth:ClientId" ] , _ configuration [ "DahuaAuth:ClientSecret" ] ) ;
DaHApiResult < LoginResDto > loginResult = await GetToken ( dto ) ;
TokenEntry refreshed = new ( )
@ -207,10 +221,11 @@ namespace Common.Shared.DomainService
try
{
var url = $"https://{_configuration[" DahuaAuth : Host "]}/evo-apigw/evo-oauth/1.0.0/oauth/public-key" ;
_l ogger . LogWarning ( $"获取的url{url}" ) ;
using var resp = await _ http . GetAsync ( url ) ;
resp . EnsureSuccessStatusCode ( ) ;
var json = await resp . Content . ReadAsStringAsync ( ) ;
_l ogger . LogWarning ( $"获取密钥的结果json{json}" ) ;
var envelope = JsonSerializer . Deserialize < DaHApiResult < PublicKeyDto > > ( json , new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
@ -230,7 +245,7 @@ namespace Common.Shared.DomainService
}
catch ( Exception ex )
{
_l ogger . LogWarning ( ex , "大华平台获取公钥出错" ) ;
_l ogger . LogWarning ( ex , $ "大华平台获取公钥出错{ex.Message} ") ;
result . Success = false ;
result . Code = "1001" ;
result . Msg = "获取大华公钥失败" ;
@ -267,23 +282,26 @@ namespace Common.Shared.DomainService
{
var url = $"https://{_configuration[" DahuaAuth : Host "]}/evo-apigw/evo-oauth/1.0.0/oauth/extend/token" ;
//必须加密
_l ogger . LogWarning ( $"获取token的url{url}" ) ;
_l ogger . LogWarning ( $"获取token的dto的json{dto.ToJson()}" ) ;
dto . Password = EncryptByPublicKey ( dto . Password , dto . PublicKey ! ) ;
using var resp = await _ http . PostAsJsonAsync ( url , dto ) ;
resp . EnsureSuccessStatusCode ( ) ;
_l ogger . LogWarning ( "这是正式请求的:Dahua Host = {Host}, ClientId = {ClientId},ClientSecret={ClientSecret}" , _ configuration [ "DahuaAuth:Host" ] , _ configuration [ "DahuaAuth:ClientId" ] , _ configuration [ "DahuaAuth:ClientSecret" ] ) ;
var tokenInfo = await resp . Content . ReadFromJsonAsync < DaHApiResult < LoginResDto > > ( ) ;
_l ogger . LogWarning ( $"获取大华登录令牌返回结果:{tokenInfo.ToJson()}" ) ;
if ( tokenInfo = = null | | ! result . Success | | result . Code ! = "0" )
{
result . Success = false ;
result . Code = "1004" ;
result . Msg = "获取大华登录令牌失败" ;
_l ogger . LogWarning ( "获取大华登录令牌失败,返回结果:{Result}" , result ) ;
_l ogger . LogWarning ( $ "获取大华登录令牌失败,返回结果:{result}" ) ;
}
result = tokenInfo ! ;
//固定的拼接方式
if ( tokenInfo ? . Data ! . AccessToken ! = null & & tokenInfo ? . Data ! . AccessToken . Length > 1 )
{
result . Data ! . AccessToken = string . Concat ( tokenInfo ? . Data ! . TokenType , " " , tokenInfo ? . Data ! . AccessToken ) ;
TokenEntry refreshed = new TokenEntry
{
AccessToken = string . Concat ( result ! . Data . TokenType , " " , result . Data . AccessToken ) ,
@ -291,9 +309,17 @@ namespace Common.Shared.DomainService
ExpireAt = DateTimeOffset . UtcNow . AddSeconds ( result . Data . ExpiresIn )
} ;
}
else
{
result . Success = false ;
result . Code = "1006" ;
result . Msg = "没拿到token" ;
_l ogger . LogWarning ( $"获取大华登录令牌失败,返回结果:{result}" ) ;
}
}
catch ( Exception ex )
{
_l ogger . LogError ( ex , "获取大华登录令牌出错" ) ;
_l ogger . LogError ( ex , $ "获取大华登录令牌出错{ex.Message} ") ;
result . Success = false ;
result . Code = "1004" ;
result . Msg = "获取大华登录令牌失败" ;