External RTMP source authentication

Hi,

I followed tthis tutorial: https://www.wowza.com/docs/how-to-integrate-wowza-user-authentication-with-external-authentication-systems-modulertmpauthenticate to use an external auth provider.

It works very well with the iOS GoCoder app available on the app store. I can see the hits on my authorization server and the stream starts.

However it doesn’t work with the GoCoder SDK in my custom app. If I look at the logs, my custom authorizer is never called when using the SDK.

I’m getting crazy over this. If someone has a hint it would be greatly appreciated.

<?xml version="1.0" encoding="UTF-8"?>

<Root version="1">

	<Application>

		<Name>retracklive</Name>

		<AppType>LiveHTTPOrigin</AppType>

		<Description></Description>

		<!-- Uncomment to set application level timeout values

		<ApplicationTimeout>60000</ApplicationTimeout>

		<PingTimeout>12000</PingTimeout>

		<ValidationFrequency>8000</ValidationFrequency>

		<MaximumPendingWriteBytes>0</MaximumPendingWriteBytes>

		<MaximumSetBufferTime>60000</MaximumSetBufferTime>

		<MaximumStorageDirDepth>25</MaximumStorageDirDepth>

		-->

		<Connections>

			<AutoAccept>true</AutoAccept>

			<AllowDomains></AllowDomains>

		</Connections>

		<!--

			StorageDir path variables

			

			${com.wowza.wms.AppHome} - Application home directory

			${com.wowza.wms.ConfigHome} - Configuration home directory

			${com.wowza.wms.context.VHost} - Virtual host name

			${com.wowza.wms.context.VHostConfigHome} - Virtual host home directory

			${com.wowza.wms.context.Application} - Application name

			${com.wowza.wms.context.ApplicationInstance} - Application instance name

			

		-->

		<Streams>

			<StreamType>live-record</StreamType>

			<StorageDir>${com.wowza.wms.context.VHostConfigHome}/content</StorageDir>

			<KeyDir>${com.wowza.wms.context.VHostConfigHome}/keys</KeyDir>

			<!-- LiveStreamPacketizers (separate with commas): cupertinostreamingpacketizer, smoothstreamingpacketizer, sanjosestreamingpacketizer, mpegdashstreamingpacketizer, cupertinostreamingrepeater, smoothstreamingrepeater, sanjosestreamingrepeater, mpegdashstreamingrepeater, dvrstreamingpacketizer, dvrstreamingrepeater -->

			<LiveStreamPacketizers>cupertinostreamingpacketizer, dvrstreamingpacketizer, mpegdashstreamingpacketizer, sanjosestreamingpacketizer, smoothstreamingpacketizer</LiveStreamPacketizers>

			<!-- Properties defined here will override any properties defined in conf/Streams.xml for any streams types loaded by this application -->

			<Properties>

			</Properties>

		</Streams>

		<Transcoder>

			<!-- To turn on transcoder set to: transcoder -->

			<LiveStreamTranscoder></LiveStreamTranscoder>

			<!-- [templatename].xml or ${SourceStreamName}.xml -->

			<Templates>${SourceStreamName}.xml,transrate.xml</Templates>

			<ProfileDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/profiles</ProfileDir>

			<TemplateDir>${com.wowza.wms.context.VHostConfigHome}/transcoder/templates</TemplateDir>

			<Properties>

			</Properties>

		</Transcoder>

		<DVR>

			<!-- As a single server or as an origin, use dvrstreamingpacketizer in LiveStreamPacketizers above -->

			<!-- Or, in an origin-edge configuration, edges use dvrstreamingrepeater in LiveStreamPacketizers above -->

			<!-- As an origin, also add dvrchunkstreaming to HTTPStreamers below -->

			<!-- If this is a dvrstreamingrepeater, define Application/Repeater/OriginURL to point back to the origin -->

			<!-- To turn on DVR recording set Recorders to dvrrecorder.  This works with dvrstreamingpacketizer  -->

			<Recorders>dvrrecorder</Recorders>

			<!-- As a single server or as an origin, set the Store to dvrfilestorage-->

			<!-- edges should have this empty -->

			<Store>dvrfilestorage</Store>

			<!--  Window Duration is length of live DVR window in seconds.  0 means the window is never trimmed. -->

			<WindowDuration>0</WindowDuration>

			<!-- Storage Directory is top level location where dvr is stored.  e.g. c:/temp/dvr -->

			<StorageDir>${com.wowza.wms.context.VHostConfigHome}/dvr</StorageDir>

			<!-- valid ArchiveStrategy values are append, version, delete -->

			<ArchiveStrategy>append</ArchiveStrategy>

			<!-- Properties for DVR -->

			<Properties>

				<Property>

					<Name>httpRandomizeMediaName</Name>

					<Value>true</Value>

					<Type>Boolean</Type>

				</Property>

			</Properties>

		</DVR>

		<TimedText>

			<!-- VOD caption providers (separate with commas): vodcaptionprovidermp4_3gpp, vodcaptionproviderttml, vodcaptionproviderwebvtt,  vodcaptionprovidersrt, vodcaptionproviderscc -->

			<VODTimedTextProviders></VODTimedTextProviders>

			<!-- Properties for TimedText -->

			<Properties>

			</Properties>

		</TimedText>

		<!-- HTTPStreamers (separate with commas): cupertinostreaming, smoothstreaming, sanjosestreaming, mpegdashstreaming, dvrchunkstreaming -->

		<HTTPStreamers>cupertinostreaming, smoothstreaming, sanjosestreaming, mpegdashstreaming, dvrchunkstreaming</HTTPStreamers>

		<MediaCache>

			<MediaCacheSourceList></MediaCacheSourceList>

		</MediaCache>

		<SharedObjects>

			<StorageDir>${com.wowza.wms.context.VHostConfigHome}/applications/${com.wowza.wms.context.Application}/sharedobjects/${com.wowza.wms.context.ApplicationInstance}</StorageDir>

		</SharedObjects>

		<Client>

			<IdleFrequency>-1</IdleFrequency>

			<Access>

				<StreamReadAccess></StreamReadAccess>

				<StreamWriteAccess>*</StreamWriteAccess>

				<StreamAudioSampleAccess></StreamAudioSampleAccess>

				<StreamVideoSampleAccess></StreamVideoSampleAccess>

				<SharedObjectReadAccess>*</SharedObjectReadAccess>

				<SharedObjectWriteAccess>*</SharedObjectWriteAccess>

			</Access>

		</Client>

		<RTP>

			<!-- RTP/Authentication/[type]Methods defined in Authentication.xml. Default setup includes; none, basic, digest -->

			<Authentication>

				<PublishMethod>digest</PublishMethod>

				<PlayMethod>block</PlayMethod>

			</Authentication>

			<!-- RTP/AVSyncMethod. Valid values are: senderreport, systemclock, rtptimecode -->

			<AVSyncMethod>senderreport</AVSyncMethod>

			<MaxRTCPWaitTime>12000</MaxRTCPWaitTime>

			<IdleFrequency>75</IdleFrequency>

			<RTSPSessionTimeout>90000</RTSPSessionTimeout>

			<RTSPMaximumPendingWriteBytes>0</RTSPMaximumPendingWriteBytes>

			<RTSPBindIpAddress></RTSPBindIpAddress>

			<RTSPConnectionIpAddress>0.0.0.0</RTSPConnectionIpAddress>

			<RTSPOriginIpAddress>127.0.0.1</RTSPOriginIpAddress>

			<IncomingDatagramPortRanges>*</IncomingDatagramPortRanges>

			<!-- Properties defined here will override any properties defined in conf/RTP.xml for any depacketizers loaded by this application -->

			<Properties>

			</Properties>

		</RTP>

		<MediaCaster>

			<RTP>

				<RTSP>

					<!-- udp, interleave -->

					<RTPTransportMode>interleave</RTPTransportMode>

				</RTSP>

			</RTP>

			<StreamValidator>

				<Enable>true</Enable>

				<ResetNameGroups>true</ResetNameGroups>

				<StreamStartTimeout>20000</StreamStartTimeout>

				<StreamTimeout>12000</StreamTimeout>

				<VideoStartTimeout>0</VideoStartTimeout>

				<VideoTimeout>0</VideoTimeout>

				<AudioStartTimeout>0</AudioStartTimeout>

				<AudioTimeout>0</AudioTimeout>

				<VideoTCToleranceEnable>false</VideoTCToleranceEnable>

				<VideoTCPosTolerance>3000</VideoTCPosTolerance>

				<VideoTCNegTolerance>-500</VideoTCNegTolerance>

				<AudioTCToleranceEnable>false</AudioTCToleranceEnable>

				<AudioTCPosTolerance>3000</AudioTCPosTolerance>

				<AudioTCNegTolerance>-500</AudioTCNegTolerance>

				<DataTCToleranceEnable>false</DataTCToleranceEnable>

				<DataTCPosTolerance>3000</DataTCPosTolerance>

				<DataTCNegTolerance>-500</DataTCNegTolerance>

				<AVSyncToleranceEnable>false</AVSyncToleranceEnable>

				<AVSyncTolerance>1500</AVSyncTolerance>

				<DebugLog>false</DebugLog>

			</StreamValidator>

			<!-- Properties defined here will override any properties defined in conf/MediaCasters.xml for any MediaCasters loaded by this applications -->

			<Properties>

			</Properties>

		</MediaCaster>

		<MediaReader>

			<!-- Properties defined here will override any properties defined in conf/MediaReaders.xml for any MediaReaders loaded by this applications -->

			<Properties>

			</Properties>

		</MediaReader>

		<MediaWriter>

			<!-- Properties defined here will override any properties defined in conf/MediaWriter.xml for any MediaWriter loaded by this applications -->

			<Properties>

			</Properties>

		</MediaWriter>

		<LiveStreamPacketizer>

			<!-- Properties defined here will override any properties defined in conf/LiveStreamPacketizers.xml for any LiveStreamPacketizers loaded by this applications -->

			<Properties>

				<Property>

					<Name>httpRandomizeMediaName</Name>

					<Value>true</Value>

					<Type>Boolean</Type>

				</Property>

			</Properties>

		</LiveStreamPacketizer>

		<HTTPStreamer>

			<!-- Properties defined here will override any properties defined in conf/HTTPStreamers.xml for any HTTPStreamer loaded by this applications -->

			<Properties>

				<Property>

					<Name>httpOriginMode</Name>

					<Value>on</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>cupertinoCacheControlPlaylist</Name>

					<Value>max-age=1</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>cupertinoCacheControlMediaChunk</Name>

					<Value>max-age=3600</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>smoothCacheControlPlaylist</Name>

					<Value>max-age=1</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>smoothCacheControlMediaChunk</Name>

					<Value>max-age=3600</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>smoothCacheControlDataChunk</Name>

					<Value>max-age=3600</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>smoothStreamingEncryptionRandomIV</Name>

					<Value>false</Value>

					<Type>Boolean</Type>

				</Property>

				<Property>

					<Name>sanjoseCacheControlPlaylist</Name>

					<Value>max-age=1</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>sanjoseCacheControlMediaChunk</Name>

					<Value>max-age=3600</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>mpegdashCacheControlPlaylist</Name>

					<Value>max-age=1</Value>

					<Type>String</Type>

				</Property>

				<Property>

					<Name>mpegdashCacheControlMediaChunk</Name>

					<Value>max-age=3600</Value>

					<Type>String</Type>

				</Property>

			</Properties>

		</HTTPStreamer>

		<Manager>

			<!-- Properties defined are used by the Manager -->

			<Properties>

				<Property>

					<Name>DVREnable</Name>

					<Value>true</Value>

					<Type>Boolean</Type>

				</Property>

			</Properties>

		</Manager>

		<Repeater>

			<OriginURL></OriginURL>

			<QueryString><![CDATA[]]></QueryString>

		</Repeater>

		<StreamRecorder>

			<Properties>

			</Properties>

		</StreamRecorder>

		<Modules>

			<Module>

				<Name>base</Name>

				<Description>Base</Description>

				<Class>com.wowza.wms.module.ModuleCore</Class>

			</Module>

			<Module>

				<Name>logging</Name>

				<Description>Client Logging</Description>

				<Class>com.wowza.wms.module.ModuleClientLogging</Class>

			</Module>

			<Module>

				<Name>flvplayback</Name>

				<Description>FLVPlayback</Description>

				<Class>com.wowza.wms.module.ModuleFLVPlayback</Class>

			</Module>

			<Module>

				<Name>ModuleRTMPAuthenticate</Name>

				<Description>ModuleRTMPAuthenticate</Description>

				<Class>com.wowza.wms.security.ModuleRTMPAuthenticate</Class>

			</Module>

		</Modules>

		<!-- Properties defined here will be added to the IApplication.getProperties() and IApplicationInstance.getProperties() collections -->

		<Properties>

			<Property>

				<Name>securityPublishRequirePassword</Name>

				<Value>true</Value>

				<Type>Boolean</Type>

			</Property>

			<Property>

				<Name>usernamePasswordProviderClass</Name>

				<Value>app.retrack.authenticate.RetrackStreamAuthenticationProvider</Value>

			</Property>

			<Property>

				<Name>securityPublishValidEncoders</Name>

				<Value>Wirecast/|FME/|FMLE/|Lavf/|UA Teradek/|KulaByte/|HaivisionKB/|VidBlaster/|XSplit/|PESA|makitoX/|Elemental Live/|Wowza GoCoder SDK/</Value>

				<Type>String</Type>

			</Property>

		</Properties>

	</Application>

</Root>

Hello @Quentin Hayot, your link for the tutorial you followed didn’t work. Can you repost it please so I know which workflow you already followed? Thank you!

I updated my question with the raw link to https://www.wowza.com/docs/how-to-integrate-wowza-user-authentication-with-external-authentication-systems-modulertmpauthenticate

@Rose Power let me know if you have any clue. I’ve spent hours on that :frowning:

Hi @Quentin Hayot, yes I understand that feeling very well! Technical support will need to take a closer look though to help you. Can you please open a support ticket with us? Thanks!

Thanks @Rose Power

Ticket submitted.

I’ll update this thread with the solution when it’s fixed.

I contacted Wowza’s support and they told me that the tutorial was a bit outdated and that I had to use

ModuleCoreSecurity instead of ModuleRTMPAuthenticate.

I replaced

<Module>
	<Name>ModuleRTMPAuthenticate</Name>
	<Description>ModuleRTMPAuthenticate</Description> 				<Class>com.wowza.wms.security.ModuleRTMPAuthenticate</Class> 		</Module>

with

<Module>
	<Name>ModuleCoreSecurity</Name>
	<Description>Core Security Module for Applications</Description>
	<Class>com.wowza.wms.security.ModuleCoreSecurity</Class>
</Module>

and

<Property>
	<Name>usernamePasswordProviderClass</Name>
	<Value>app.retrack.authenticate.RetrackStreamAuthenticationProvider</Value>
</Property>

with

<Property>
	<Name>securityPublishUsernamePasswordProviderClass</Name>
	<Value>app.retrack.authenticate.RetrackStreamAuthenticationProvider</Value>
	<Type>String</Type>
</Property>

and everything works fine now.

Thanks so much for updating the community @Quentin Hayot!