Hi, A few comments:
- to generate a JWT token, you can use the pac4j-jwt module with the associated code. Internally, the CAS server uses it to decrypt JWT - you have only one primaryAuthenticationHandler: defining two makes the last one overrides the first one, thus your tokenAuthenticationHandler is never found for TokenCredential Thanks. Best regards, Jérôme 2016-07-25 13:29 GMT+02:00 Sami Ghayeni <[email protected]>: > hi, i made a simple app, the url localhost:4000/app is protected by CAS > and needs the user to sign in. it works pretty well. after i login to CAS, > going to localhost:4000/app, it shows me my website and does not ask me to > login anymore. the problem happens when i try to use a token instead of the > username:password combination. i don't understand the java code in here > <https://apereo.github.io/cas/4.2.x/installation/JWT-Authentication.html>(JWT > Authentication) but i made my token this way in node.js: > > var jwt = require('jsonwebtoken'); > > var myService = {"name": "test"}; > > var token = jwt.sign(myService, 'secret'); > > console.log(token); > > my token is > > eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoidGVzdCIsImlhdCI6MTQ2OTQ0NTM5MH0.Vfft0UIaZ2isl4kDmw23iNPvDfqlj9VaLc9qf13IcGo > > > now i go to > https://localhost/cas/login?service=http%3A%2F%2Flocalhost%3A4000%2Fapp&renew=false&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoidGVzdCIsImlhdCI6MTQ2OTQ0NTM5MH0.Vfft0UIaZ2isl4kDmw23iNPvDfqlj9VaLc9qf13IcGo > > it shows me the login page if i'm not logged in or the home page of > protected web app otherwise. at the same time i go to the above url, CAS > logs: > > 2016-07-25 15:46:47,370 WARN > [org.jasig.cas.authentication.PolicyBasedAuthenticationManager] - <Cannot > find authentication handler that supports > [org.jasig.cas.authentication.handler.support.TokenCredential@4565d915 > [service=http://localhost:4000/app]] of type [TokenCredential], which > suggests a configuration problem.> > 2016-07-25 15:46:47,373 INFO > [org.jasig.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit > trail record BEGIN > ============================================================= > WHO: org.jasig.cas.authentication.handler.support.TokenCredential@4565d915 > [service=http://localhost:4000/app] > WHAT: Supplied credentials: > [org.jasig.cas.authentication.handler.support.TokenCredential@4565d915 > [service=http://localhost:4000/app]] > ACTION: AUTHENTICATION_FAILED > APPLICATION: CAS > WHEN: Mon Jul 25 15:46:47 IRDT 2016 > CLIENT IP ADDRESS: 127.0.0.1 > SERVER IP ADDRESS: 127.0.0.1 > ============================================================= > > > > 2016-07-25 15:46:47,375 WARN > [org.jasig.cas.web.flow.token.TokenAuthenticationAction] - <0 errors, 0 > successes > org.jasig.cas.authentication.AuthenticationException: 0 errors, 0 successes > at > org.jasig.cas.authentication.PolicyBasedAuthenticationManager.evaluateProducedAuthenticationContext(PolicyBasedAuthenticationManager.java:256) > at > org.jasig.cas.authentication.PolicyBasedAuthenticationManager.authenticateInternal(PolicyBasedAuthenticationManager.java:242) > at > org.jasig.cas.authentication.PolicyBasedAuthenticationManager.authenticate(PolicyBasedAuthenticationManager.java:131) > at sun.reflect.GeneratedMethodAccessor92.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) > at > org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) > at > org.jasig.inspektr.audit.AuditTrailManagementAspect.handleAuditTrail(AuditTrailManagementAspect.java:128) > at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at > org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) > at > org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) > at > org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) > at > org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) > at > com.ryantenney.metrics.spring.MeteredMethodInterceptor.invoke(MeteredMethodInterceptor.java:45) > at > com.ryantenney.metrics.spring.MeteredMethodInterceptor.invoke(MeteredMethodInterceptor.java:32) > at > com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) > at > com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:48) > at > com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:34) > at > com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) > at > com.ryantenney.metrics.spring.CountedMethodInterceptor.invoke(CountedMethodInterceptor.java:46) > at > com.ryantenney.metrics.spring.CountedMethodInterceptor.invoke(CountedMethodInterceptor.java:32) > at > com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) > at com.sun.proxy.$Proxy69.authenticate(Unknown Source) > at > org.jasig.cas.authentication.DefaultAuthenticationTransactionManager.handle(DefaultAuthenticationTransactionManager.java:29) > at > org.jasig.cas.web.flow.token.TokenAuthenticationAction.doExecute(TokenAuthenticationAction.java:68) > at > org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) > at > org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) > at > org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:77) > at > org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188) > at > org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) > at > org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101) > at org.springframework.webflow.engine.State.enter(State.java:194) > at org.springframework.webflow.engine.Flow.start(Flow.java:527) > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:368) > at > org.springframework.webflow.engine.impl.FlowExecutionImpl.start(FlowExecutionImpl.java:223) > at > org.springframework.webflow.executor.FlowExecutorImpl.launchExecution(FlowExecutorImpl.java:140) > at > org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:238) > at > org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) > at > org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) > at > org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) > at > org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) > at > org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > at > org.apereo.cas.security.ResponseHeadersEnforcementFilter.doFilter(ResponseHeadersEnforcementFilter.java:238) > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > at > org.apereo.cas.security.RequestParameterPolicyEnforcementFilter.doFilter(RequestParameterPolicyEnforcementFilter.java:261) > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > at > org.jasig.inspektr.common.web.ClientInfoThreadLocalFilter.doFilter(ClientInfoThreadLocalFilter.java:62) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > at > org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) > at > org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) > at > org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) > at > org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442) > at > org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082) > at > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623) > at > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > at > org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) > at java.lang.Thread.run(Thread.java:745) > > > > > > my service, Test-10000005.json > > { > "@class" : "org.jasig.cas.services.RegexRegisteredService", > "serviceId" : "^http://localhost:4000.*", > "name" : "Test", > "id" : 10000005, > "description" : "test app", > "evaluationOrder" : 5, > "accessStrategy" : { > "@class" : > "org.jasig.cas.services.DefaultRegisteredServiceAccessStrategy", > "enabled" : true, > "ssoEnabled" : true > }, > "properties" : { > "@class" : "java.util.HashMap", > "jwtSigningSecret" : { > "@class" : "org.jasig.cas.services.DefaultRegisteredServiceProperty", > "values" : [ "java.util.HashSet", [ "secret" ] ] > } > } > } > > > my pom.xml > > <?xml version="1.0" encoding="UTF-8"?> > <project xmlns="http://maven.apache.org/POM/4.0.0" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 > http://maven.apache.org/xsd/maven-4.0.0.xsd "> > <modelVersion>4.0.0</modelVersion> > <groupId>tiva.microservice.cas</groupId> > <artifactId>cas</artifactId> > <packaging>war</packaging> > <version>4.2.4-SNAPSHOT</version> > > <build> > <plugins> > <plugin> > <artifactId>maven-war-plugin</artifactId> > <version>2.6</version> > <configuration> > <warName>cas</warName> > <overlays> > <overlay> > <groupId>org.jasig.cas</groupId> > <artifactId>cas-server-webapp</artifactId> > </overlay> > </overlays> > </configuration> > </plugin> > </plugins> > </build> > > <dependencies> > <!-- cas-server-webapp is the basic to use cas --> > <dependency> > <groupId>org.jasig.cas</groupId> > <artifactId>cas-server-webapp</artifactId> > <version>${cas.version}</version> > <type>war</type> > <scope>runtime</scope> > </dependency> > > <dependency> > <groupId>org.jasig.cas</groupId> > <artifactId>cas-server-support-mongo</artifactId> > <version>${cas.version}</version> > <type>jar</type> > <scope>runtime</scope> > </dependency> > > <dependency> > <groupId>org.jasig.cas</groupId> > <artifactId>cas-server-support-token-webflow</artifactId> > <version>${cas.version}</version> > </dependency> > > </dependencies> > > <properties> > <cas.version>4.2.4-SNAPSHOT</cas.version> > </properties> > > <repositories> > <repository> > <id>sonatype-releases</id> > <url>http://oss.sonatype.org/content/repositories/releases/</url> > </repository> > <repository> > <id>sonatype-snapshots</id> > <url>http://oss.sonatype.org/content/repositories/snapshots/</url> > </repository> > > </repositories> > </project> > > > > what i added to the default deployerConfigContext.xml and cas.properties > files > > <alias name="tokenAuthenticationHandler" > alias="primaryAuthenticationHandler" /> > > <alias name="mongoAuthenticationHandler" > alias="primaryAuthenticationHandler" /> > > > cas.authn.mongo.collection.name=users > cas.authn.mongo.db.host=mongodb:// > aseds4:[email protected]:61360/mydb > cas.authn.mongo.attributes=attribute1,attribute2 > cas.authn.mongo.username.attribute=name > cas.authn.mongo.password.attribute=password > > > i want to create some kind of a microservices architecture. i've been told > that one of the best waysdo so is to use JWT's/tokens. so one > module(microservice) which have a token, can access resources on another > module. without the need to pass username or password to the second web > service. > > i would be grateful for any help you are able to provide. > > -- > You received this message because you are subscribed to the Google Groups > "CAS Community" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/a/apereo.org/group/cas-user/ > . > To view this discussion on the web visit > https://groups.google.com/a/apereo.org/d/msgid/cas-user/7859779a-7b84-4e60-9277-c059de33ba08%40apereo.org > <https://groups.google.com/a/apereo.org/d/msgid/cas-user/7859779a-7b84-4e60-9277-c059de33ba08%40apereo.org?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/a/apereo.org/d/optout. > -- You received this message because you are subscribed to the Google Groups "CAS Community" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/a/apereo.org/group/cas-user/. To view this discussion on the web visit https://groups.google.com/a/apereo.org/d/msgid/cas-user/CAP279Lw%2Bm2uzXSqtvKD8_HQG0Kk-Lx%2Bx6w7i9r%3DK2Ckjn0pFbQ%40mail.gmail.com. For more options, visit https://groups.google.com/a/apereo.org/d/optout.
