登录用户 null Auth0/Spark Java

Posted

技术标签:

【中文标题】登录用户 null Auth0/Spark Java【英文标题】:Logged in user null Auth0/Spark Java 【发布时间】:2017-04-08 07:22:10 【问题描述】:

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

        @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);

我尝试过使用 Spark 做类似的事情,但由于 get 在 Spark 中的工作方式有点不同,所以我这样做:

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());

即使用户已创建并存储在数据库中并且登录正常工作且没有运行时或控制台错误,代码也始终将用户报告为 null。我尝试的其他方法替换了设置用户变量的行并编写了以下内容。 替代方法一: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();
    

我不知道为什么用户每次都被评估为 null,我希望得到一些关于我做错了什么的反馈。谢谢。

【问题讨论】:

您好,请问您能否在 brouser 中显示(屏幕截图)您的请求/响应详细信息? 【参考方案1】:

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

在您用作参考的auth0-servlet-sample 中,这是通过配置Auth0ServletCallback 来完成的,该Auth0ServletCallback 将处理对/callback 端点执行的请求。由于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-servlet-sso-sample、auth0-spring-mvc-sample、auth0-spring-security-api-sample 和 auth0-spring-security-mvc-sample)不包括 spark-java 的样本,因此我无法向您推荐任何样本。

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

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

【讨论】:

谢谢,不敢相信我错过了它正在调用 setAuth0User。我现在刚刚转向处理身份验证客户端,然后再传递给服务器进行最终验证。

以上是关于登录用户 null Auth0/Spark Java的主要内容,如果未能解决你的问题,请参考以下文章

使用 google 登录创建 firebase 用户 .getCurrentUser() 返回 null

我正在尝试登录并检查用户是不是存在,但我的执行标量一直返回 null,我不知道为啥?

在没有用户登录屏幕的情况下从Javascript调用安全的REST API

Laravel auth()->guard() 使用 vue js 返回 null

获取登录用户ip

仅当在流程中添加帐户时,Google 登录才会将显示名称返回为 null