登录用户 null Auth0/Spark Java

Logged in user null Auth0/Spark Java

我正在尝试将 Auth0 集成到我使用 spark-java 框架的网络应用程序中。 问题是虽然身份验证工作完美,包括回调(我看到在 Auth0 的网站上创建了新用户并且我的网站被重定向),但我无法访问登录的用户信息。我已经尝试了几种方法,例如 SessionUtils.getAuth0User(request.raw()) 和 none,它们都有效。 例如,在此处提供的教程中: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。我尝试的其他方法我替换了我设置用户变量的行并写了以下内容。
替代方法 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();

此外,这是我的 java 脚本代码 运行 用于身份验证的客户端:

    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,我希望得到一些关于我做错了什么的反馈。谢谢。

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

在您用作参考的 auth0-servlet-sample 中,这是通过配置 Auth0ServletCallback that will handle requests performed to /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 and auth0-spring-security-mvc-sample) 不包括 spark-java 的示例,因此我无法向您推荐任何示例。

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

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