我有一个使用普通 Leaflet、HTML、CSS 和 JS 启动并运行的传单应用程序。目前,它仅位于一个文件夹中,其中包含一个 index.html 文件、一个 main.js 文件和一个包含我所有数据的文件夹。数据是geojson数据。我最终希望当我将其在线时,用户无法访问我正在使用的数据。我正在寻找关于我应该如何解决这个问题的大局、大纲。
我正在考虑使用 MongoDB 之类的东西来存储我的数据,但网上没有关于如何使用 Leaflet 精确做到这一点的先例或教程。它似乎还需要对我的代码进行大量更改,并尝试将express和节点(?)添加到我的应用程序中。任何想法或示例链接将不胜感激。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
您对 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;
}
}
}