FusionAuth外部JWT提供程序

时间:2019-08-20 08:35:53

标签: fusionauth

我正在尝试使用由外部JWT Provider发行的JWT令牌登录。 当我使用协调API时,出现以下堆栈跟踪信息,出现500错误:

Aug 20, 2019 8:03:16.428 AM ERROR io.fusionauth.app.primeframework.error.ExceptionExceptionHandler - An unhandled exception was thrown
java.lang.NullPointerException: null
        at io.fusionauth.jwt.domain.JWT.lookupClaim(JWT.java:416)
        at io.fusionauth.jwt.domain.JWT.getString(JWT.java:347)
        at io.fusionauth.api.service.authentication.ExternalJWTIdentityProviderAuthenticationService.reconcile(ExternalJWTIdentityProviderAuthenticationService.java:90)
        at io.fusionauth.app.action.api.identityProvider.LoginAction.post(LoginAction.java:59)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.primeframework.mvc.util.ReflectionUtils.invoke(ReflectionUtils.java:436)
        at org.primeframework.mvc.action.DefaultActionInvocationWorkflow.execute(DefaultActionInvocationWorkflow.java:84)
        at org.primeframework.mvc.action.DefaultActionInvocationWorkflow.perform(DefaultActionInvocationWorkflow.java:64)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.validation.DefaultValidationWorkflow.perform(DefaultValidationWorkflow.java:47)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.security.DefaultSecurityWorkflow.perform(DefaultSecurityWorkflow.java:60)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.parameter.DefaultPostParameterWorkflow.perform(DefaultPostParameterWorkflow.java:50)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.content.DefaultContentWorkflow.perform(DefaultContentWorkflow.java:52)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.parameter.DefaultParameterWorkflow.perform(DefaultParameterWorkflow.java:57)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.parameter.DefaultURIParameterWorkflow.perform(DefaultURIParameterWorkflow.java:102)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.scope.DefaultScopeRetrievalWorkflow.perform(DefaultScopeRetrievalWorkflow.java:58)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.message.DefaultMessageWorkflow.perform(DefaultMessageWorkflow.java:45)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.action.DefaultActionMappingWorkflow.perform(DefaultActionMappingWorkflow.java:126)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.workflow.StaticResourceWorkflow.perform(StaticResourceWorkflow.java:97)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.parameter.RequestBodyWorkflow.perform(RequestBodyWorkflow.java:89)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.security.DefaultSavedRequestWorkflow.perform(DefaultSavedRequestWorkflow.java:57)
        at org.primeframework.mvc.workflow.SubWorkflowChain.continueWorkflow(SubWorkflowChain.java:43)
        at org.primeframework.mvc.workflow.DefaultMVCWorkflow.perform(DefaultMVCWorkflow.java:91)
        at org.primeframework.mvc.workflow.DefaultWorkflowChain.continueWorkflow(DefaultWorkflowChain.java:44)
        at org.primeframework.mvc.servlet.FilterWorkflowChain.continueWorkflow(FilterWorkflowChain.java:50)
        at org.primeframework.mvc.servlet.PrimeFilter.doFilter(PrimeFilter.java:84)
        at com.inversoft.maintenance.servlet.MaintenanceModePrimeFilter.doFilter(MaintenanceModePrimeFilter.java:59)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at com.inversoft.servlet.CORSFilter.handleNonCORS(CORSFilter.java:748)
        at com.inversoft.servlet.CORSFilter.doFilter(CORSFilter.java:646)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at com.inversoft.servlet.UTF8Filter.doFilter(UTF8Filter.java:27)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

这是我解码的JWT有效负载:

{
  "user_name": "name.surname",
  "scope": [
    "read"
  ],
  "exp": 1566331043,
  "applicationId": "37cf7a75-6b3a-49d9-99d9-6f261c4f6851",
  "jti": "eddc15b6-f479-47c0-8d08-8b9aacf6dbe8",
  "email": "name.surname@domain.pl",
  "client_id": "37cf7a75-6b3a-49d9-99d9-6f261c4f6851"
}
提供程序配置中的

“ uniqueIdentityClaim”设置为“电子邮件”。我也尝试将其设置为“ user_name”,但是它什么也没做。 看起来它在io.fusionauth.jwt.domain.JWT.lookupClaim(JWT.java:416)上搜索“空”声明,但是当令牌已填充所有字段时,我不知道何时以及如何在其中传递null。有什么建议吗?

编辑:

更新: 我试图使其工作,但我发现它在特定情况下可以工作。这是代码的一部分:

        UUID appId = fusionAuthConfig.getApplication().id;
        LookupResponse lookupResponse = lambdaDelegate.execute(x -> x.lookupIdentityProvider("domain.pl"));
        IdentityProviderLoginRequest request = new IdentityProviderLoginRequest();
        request.identityProviderId = lookupResponse.identityProvider.id;
        request.applicationId = appId;
        request.setEncodedJWT(token);
        LoginResponse response = lambdaDelegate.execute(x -> x.reconcileJWT(request));
        return response;

当我在线调试时

        LoginResponse response = lambdaDelegate.execute(x -> x.reconcileJWT(request));

,请稍等片刻。没有错误,用户已在我的应用程序中的FusionAuth中注册和登录,并且在使用返回的令牌时获得了端点的授权。 仍在尝试找出为什么能在我调试该行并等待时起作用。

1 个答案:

答案 0 :(得分:0)

我设法解决了。问题出在使用lambdaDelegate。当我删除 '''

LookupResponse lookupResponse = lambdaDelegate.execute(x -> x.lookupIdentityProvider("domain.pl"));

''' 有效。我只需要传递identifyProviderUuid,而不是查找它。当从FusionAuth的2个方法一个接一个地调用而第一个方法还没有完成时,似乎存在某种冲突