搜索

首页  >  问答  >  正文

Leaflet中的数据存储在哪里

我有一个使用普通 Leaflet、HTML、CSS 和 JS 启动并运行的传单应用程序。目前,它仅位于一个文件夹中,其中包含一个 index.html 文件、一个 main.js 文件和一个包含我所有数据的文件夹。数据是geojson数据。我最终希望当我将其在线时,用户无法访问我正在使用的数据。我正在寻找关于我应该如何解决这个问题的大局、大纲。

我正在考虑使用 MongoDB 之类的东西来存储我的数据,但网上没有关于如何使用 Leaflet 精确做到这一点的先例或教程。它似乎还需要对我的代码进行大量更改,并尝试将express和节点(?)添加到我的应用程序中。任何想法或示例链接将不胜感激。

P粉883973481P粉883973481268 天前442

全部回复(1)我来回复

  • P粉505917590

    P粉5059175902024-02-26 00:38:30

    您对 MongoDB 的思考方向是错误的,因为这不会以任何额外的方式保护您的数据。

    不可能提供纯 HTML 网页,而是隐藏数据 - 因为任何人都可以在 HTML 源代码中查找访问权限。

    您需要的是支持 OAuth 的第三方提供商,例如:

    他们会向您颁发 JWT,如下面的华为文档所示,然后在服务器端您需要验证令牌并决定是否提供数据。

    即使这样,授权客户也可以获取并分发您的数据。

    我知道这些东西,因为作为一名业余开发者,我编写了 2 个网页游戏,并且我正在使用这 4 个服务(还有更多)来验证用户。

    这是我的服务器端 Java 代码示例,用于验证华为 Account Kit:

    private void handleHuaweiAuth(HttpServletRequest httpReq, HttpServletResponse httpResp) throws ServletException, IOException {
        String error            = httpReq.getParameter("error");
        String errorDescription = httpReq.getParameter("error_description");
        String code             = httpReq.getParameter("code");
        String state            = httpReq.getParameter("state");
    
        // use hash of salt and current month name as CSRF protection
        String month = md5("PUT SOME SECRET HERE" + Calendar.getInstance().getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH));
    
        if (error != null) {
            throw new ServletException(error + ": " + errorDescription);
            
        } else if (code != null && month.equals(state)) {
            MultiMap postParams = new MultiMap<>();
            postParams.put("code",          code);
            postParams.put("client_id",     HUAWEI_ID);
            postParams.put("client_secret", HUAWEI_SECRET);
            postParams.put("redirect_uri",  String.format(HUAWEI_REDIRECT_URI, mLanguage));
            postParams.put("grant_type",    "authorization_code");
            
            try {
                String tokenStr = mHttpClient.POST(HUAWEI_TOKEN_URL)
                    .headers(httpFields ->
                    {
                        httpFields.add(new HttpField(HttpHeader.ACCEPT, APPLICATION_JSON));
                        httpFields.add(new HttpField(HttpHeader.CONTENT_TYPE, APPLICATION_URLENCODED));
                    })
                    .body(new StringRequestContent(UrlEncoded.encode(postParams, StandardCharsets.UTF_8, false)))
                    .send().getContentAsString();
                LOG.info("handleHuaweiAuth tokenStr = {}", tokenStr);
                Map tokenMap = (Map) new JSON().fromJSON(tokenStr);
                //String accessToken = tokenMap.get("access_token");
                //String refreshToken = tokenMap.get("refresh_token");
    
                // NOTE: the code is only valid for 1 usage.
                // If the user reloads this page, then the following will be returned:
                // {"sub_error":20156,"error_description":"code used twice","error":1101}
                // parsing token will result in NPE caught below and redirect to front page
    
                String idToken = tokenMap.get("id_token");
                Map idMap = parseJwt(idToken);
                String sid    = idMap.get("sub"); 
                String photo  = idMap.get("picture");
                String given  = idMap.get("given_name");
                String family = idMap.get("family_name");
    
                printGameApp(httpReq, httpResp, HUAWEI, sid, given, family, photo);
                return;
            } catch (InterruptedException | TimeoutException | ExecutionException | NullPointerException ex) {
                LOG.warn("handleHuaweiAuth", ex);
                // redirect to the front page
                httpResp.sendRedirect("/");
                return;
            }
        }
    }

    回复
    0
  • 取消回复