convert this C# code into ruby
require 'securerandom'
require 'uri'
require 'base64'
require 'openssl'
require 'digest'
class InboundPftPopTokenValidator < InboundJwtTokenValidatorBase
TokenSignerCacheSize = 500
def initialize(clientTokenData, monitoringApi, authConfiguration, actorTokenValidator, accessTokenValidator, incomingMethod, incomingUri)
super(clientTokenData, monitoringApi, authConfiguration, 'InboundPftPopTokenValidator', validateClientId: false)
@clientTokenData = clientTokenData
@actorTokenValidator = actorTokenValidator
@accessTokenValidator = accessTokenValidator
@incomingMethod = incomingMethod
@incomingUri = incomingUri
@actorTokenData = InboundJwtActorTokenData.Parse(ClientTokenData.PftPopJwtTokenData.Payload.ActorToken, monitoringApi, out _)
@accessTokenData = InboundJwtTokenData.Parse(ClientTokenData.PftPopJwtTokenData.Payload.AccessTokenAad, monitoringApi, out _)
@acceptedAudCollection = get_pft_audience_collection(tokenValidationError)
end
def validate_token_async
if AuthConfiguration.LogInboundTokenDataWithoutSignature
TokenLogger.LogEncodedJwtTokenData('InboundPftPopTokenValidator_TokenHeaderPayload', ClientTokenData.PostTransformedToken, MonitoringApi)
end
valid_pop_token_header = validate_pop_token_header_claims(tokenValidationError)
return TokenValidationResult.FromTokenValidationError(tokenValidationError) unless valid_pop_token_header
valid_pop_token_payload = validate_pop_token_payload_claims(tokenValidationError)
return TokenValidationResult.FromTokenValidationError(tokenValidationError) unless valid_pop_token_payload
if @acceptedAudCollection.nil? || tokenValidationError
return TokenValidationResult.FromTokenValidationError(tokenValidationError)
end
end
private
def get_pft_audience_collection(tokenValidationError)
audience_claim = @clientTokenData.PftPopJwtTokenData.Payload.Aud
if audience_claim.nil?
tokenValidationError = TokenValidationError.CreateAudienceClaimMissingValidationError
return nil
end
audience_collection = audience_claim.split(' ').to_set
if audience_collection.empty?
tokenValidationError = TokenValidationError.CreateAudienceClaimMissingValidationError
return nil
end
audience_collection
end
def validate_pop_token_header_claims(tokenValidationError)
pop_token_header = @clientTokenData.PftPopJwtTokenData.Header
unless pop_token_header['alg'] == 'RS256'
tokenValidationError = TokenValidationError.CreateInvalidPopTokenAlgorithmHeaderValidationError('RS256')
return false
end
unless pop_token_header['typ'] == 'pop+jwt'
tokenValidationError = TokenValidationError.CreateInvalidPopTokenTypeHeaderValidationError('pop+jwt')
return false
end
true
end
def validate_pop_token_payload_claims(tokenValidationError)
pop_token_payload = @clientTokenData.PftPopJwtTokenData.Payload
unless pop_token_payload['at'] == @clientTokenData.PftPopJwtTokenData.Payload.AccessTokenAad
tokenValidationError = TokenValidationError.CreatePopTokenMismatchedAtValidationError
return false
end
unless pop_token_payload['m'] == @incomingMethod
tokenValidationError = TokenValidationError.CreatePopTokenMismatchedMethodValidationError
return false
end
unless pop_token_payload['u'] == @incomingUri.to_s
tokenValidationError = TokenValidationError.CreatePopTokenMismatchedUriValidationError
return false
end
true
end
end