How do I make authentication headers for httpClient?

Enonic version: 6.3.0-SNAPSHOT
OS: OSX

I’m trying to have user created content be made in the draft branch and then immediately published with the httpClientLib request to admin/rest/content/publish but it comes back with 403, even when I use the contextLib runAs() for su. It looks like this needs authentication headers. How do I make that?

I tried http://su:password@localhost:8080/admin/rest/content/publish and that didn’t work either.

I think I got the authentication working. You can see the response: {“authenticated”:true,“principals”:[“role:system.admin”,“role:system.admin.login”,“role:system.authenticated”,“role:system.everyone”,“user:system:su”]}}

But now it says:

Can not deserialize instance of com.enonic.xp.admin.impl.rest.resource.content.json.PublishContentJson out of START_ARRAY token
     at [Source: HttpInputOverHTTP@6f91f491[c=15,s=STREAM]; line: 1, column: 1]

Maybe the problem is with the body? Here is the httpClient request:

        var response = httpClientLib.request({
            url: 'http://localhost:8080/admin/rest/content/publish',
            method: 'POST',
            headers: {
                'Authorization': 'Basic ' + Base64.encode('su:password'),
                'Accept': 'application/json'
            },
            connectionTimeout: 2000,
            readTimeout: 5000,
            body: {
                "ids": [theContent._id],
                "includeChildren": false
            },
            contentType: 'application/json;charset=UTF-8'
        });

The full stack trace is below.

00:07:36.420 ERROR c.e.x.j.i.e.JsonExceptionMapper - Can not deserialize instance of com.enonic.xp.admin.impl.rest.resource.content.json.PublishContentJson out of START_ARRAY token
 at [Source: HttpInputOverHTTP@6f91f491[c=15,s=STREAM]; line: 1, column: 1]
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.enonic.xp.admin.impl.rest.resource.content.json.PublishContentJson out of START_ARRAY token
 at [Source: HttpInputOverHTTP@6f91f491[c=15,s=STREAM]; line: 1, column: 1]
	at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) ~[na:na]
	at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:854) ~[na:na]
	at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:850) ~[na:na]
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1257) ~[na:na]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:155) ~[na:na]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:134) ~[na:na]
	at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1470) ~[na:na]
	at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:912) ~[na:na]
	at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:811) ~[na:na]
	at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.readFrom(AbstractReaderInterceptorContext.java:59) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.interception.ServerReaderInterceptorContext.readFrom(ServerReaderInterceptorContext.java:62) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:51) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:59) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:150) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:89) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:112) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237) ~[repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) [repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) [repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) [repack-resteasy-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.jaxrs.impl.JaxRsServlet.service(JaxRsServlet.java:49) [jaxrs-impl-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:85) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:79) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.impl.auth.BasicAuthFilter.doHandle(BasicAuthFilter.java:31) [web-impl-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.impl.context.ContextFilter.lambda$doHandle$0(ContextFilter.java:34) [web-impl-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.context.ContextImpl.callWith(ContextImpl.java:101) ~[core-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.impl.context.ContextFilter.doHandle(ContextFilter.java:33) [web-impl-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.vhost.impl.VirtualHostFilter.doHandle(VirtualHostFilter.java:32) ~[na:na]
	at com.enonic.xp.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:31) [web-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.filter.BaseWebFilter.doFilter(BaseWebFilter.java:33) [web-api-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at com.enonic.xp.web.impl.dos.DosFilterWrapper.doFilter(DosFilterWrapper.java:60) ~[na:na]
	at org.apache.felix.http.base.internal.handler.FilterHandler.handle(FilterHandler.java:135) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.InvocationChain.doFilter(InvocationChain.java:74) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:124) ~[na:na]
	at org.apache.felix.http.base.internal.DispatcherServlet.service(DispatcherServlet.java:61) ~[na:na]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [web-jetty-6.3.0-SNAPSHOT.jar:6.3.0-SNAPSHOT]
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821) ~[na:na]
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583) ~[na:na]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[na:na]
	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:375) ~[na:na]
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) ~[na:na]
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158) ~[na:na]
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) ~[na:na]
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) ~[na:na]
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090) ~[na:na]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[na:na]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119) ~[na:na]
	at org.eclipse.jetty.server.Server.handle(Server.java:517) ~[na:na]
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306) ~[na:na]
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242) ~[na:na]
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261) ~[na:na]
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) ~[na:na]
	at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75) ~[na:na]
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213) ~[na:na]
	at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147) ~[na:na]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) ~[na:na]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) ~[na:na]
	at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_65]

I know this could be done using Java but I’m trying to keep it simple.

Ok, first off. The run function in lib-context will not work for external service you call using a rest-client. It’s only working for functions called inside the same “context”.

I see that you are trying to publish using the admin rest API and I would not use that directly since it’s not public and will change without notification. We should really create a publish function that can be used, but in the mean time it’s better to use Java for this.

Can help you with this together with @rmy and then we could push this back into 6.4.

@mla: The publish-function in content-lib is planned for 6.4 (which should be released late january)

@jsi will be working on this, please consult with him regarding the progress on this.

1 Like