2016-11-24 66 views
3

我正在尝试将Auth0集成到使用spark-java框架的web应用程序中。 问题是,虽然身份验证完美,包括回调(我看到在Auth0的网站上创建的新用户,我的网站被重定向),但我无法访问登录的用户信息。我已经尝试了SessionUtils.getAuth0User(request.raw())之类的几种方法,但都没有工作。 例如在所提供的教程在这里:https://github.com/auth0-samples/auth0-servlet-sample/tree/master/01-Login 他们访问登录的用户信息,像这样:登录user null Auth0/Spark Java

 @Override 
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
    final Auth0User user = SessionUtils.getAuth0User(req); 
    if (user != null) { 
     req.setAttribute("user", user); 
    } 
    req.getRequestDispatcher("/WEB-INF/jsp/home.jsp").forward(req, res); 
} 

我试着做星火类似的事情,但由于得到星火作品有点不同我这样做:

port(Integer.valueOf(System.getenv("PORT"))); 
staticFileLocation("/spark/template/freemarker"); 
String clientId = System.getenv("AUTH0_CLIENT_ID"); 
String clientDomain = System.getenv("AUTH0_DOMAIN"); 
    get("/", (request, response) -> 
    { 
     Map<String, Object> attributes = new HashMap<>(); 
     Auth0User user = SessionUtils.getAuth0User(request.raw()); 
     if(user != null) { 
      attributes.put("user", user); 
      attributes.put("loggedIn" , true); 
     } 
     else 
      attributes.put("loggedIn" , false); 
     attributes.put("clientId" , clientId); 
     attributes.put("clientDomain" , clientDomain); 
     return new ModelAndView(attributes, "index.ftl"); 
    }, new FreeMarkerEngine()); 

的代码始终报告作为用户即使创建并存储在数据库中的用户和登入没有运行或控制台错误工作正常空。我尝试过的其他方法替换了我设置用户变量的行,并写下了以下内容。
替代方法1:
Auth0User user = (Auth0User) request.session().attribute("auth0User");
这里auth0User是相同的字符串文字Auth0在其实施SessionUtils的使用如图此处引用它们的源代码:https://github.com/auth0/auth0-java-mvc-common/blob/master/src/main/java/com/auth0/SessionUtils.java

替代方法2:
Auth0User user = (Auth0User) request.raw().getUserPrincipal();

另外这是我的javascript代码,运行客户端认证:

var lock = new Auth0Lock('${clientId}', '${clientDomain}', { 
     auth: { 
      redirectUrl: 'http://localhost:5000/build', 
      responseType: 'code', 
      params: { 
      scope: 'openid user_id name nickname email picture' 
      } 
     } 
    }); 

    $(document).ready(function() 
    { 
     $('.signup').click(function() 
     { 
      doSignup(); 
     }); 
    }); 

    function doSignup() { 
     lock.show(); 
    } 

我不知道为什么用户每次都会被评估为空,而且我会喜欢关于我在做什么错误的一些反馈。谢谢。

+0

嗨,咕,请您在布鲁克的请求/响应细节显示(截图)? – Andrew

回答

1

为了让您从SessionUtils.getAuth0User(req)得到一个非null用户实例,某些代码必须首先调用SessionUtils.setAuth0User。这应该在您收到用户验证成功的确认信息时完成。

在您用作参考的auth0-servlet-sample中,通过配置将处理对/callback端点执行的请求的Auth0ServletCallback来完成此操作。由于Auth0ServletCallback为你设置的用户调用(见下面的代码),在servlet的例子中,你可以让用户成功。

protected void store(final Tokens tokens, final Auth0User user, final HttpServletRequest req) 
{ 
    SessionUtils.setTokens(req, tokens); 
    SessionUtils.setAuth0User(req, user); 
} 

目前可用的样本(auth0-servlet-sample,​​,auth0-spring-mvc-sampleauth0-spring-security-api-sampleauth0-spring-security-mvc-sample)不包括一个用于spark-java,所以我不能向您推荐任何样品。

为了解决这个问题,你必须包含额外的逻辑来处理身份验证操作的结果在您的spark-java申请,并成功的情况下调用SessionUtils.setAuth0User自己,如果你再要使用相应的SessionUtils.getAuth0User方法。

有关将Web应用程序与Auth0集成的一般指导,请参阅Integrating a Web App with Auth0

+0

谢谢,不能相信我错过了它正在调用setAuth0User。现在我已经转向处理auth客户端,然后传递给服务器进行最终验证。 – kcilc