How to force download a file using node js? - node.js

My concept is like that,I will send a request from frontend along with few params to backend (nodejs, express). Backend will check params info then will generate a downloadable link that user will be able to download without knowing the downloadable link.
I am expecting,
User will send: www.something.com/param?key=23232323
Backend will verify the key and will generate www.something.com/download/image.zip (that should be unknown by user).
User will get image.zip file. That download link should not be exposed.
Any other idea is appreciable.

Related

How to download a file from a node server, using a react client, but hiding the filename and the path

I have a client/server architecture:
the client is running a reactjs & javascript application;
the server is running a nodejs application with a redis database.
The application start with the client asking the user for his/her email
then pass the email to the server which activates a two factor authentication sending a code to the user's phone.
the server send the user's phone a random code
the user insert the received code into the client and send back to the server
the server check the code and, if correct, send to the client a list of the user's owned files.
The client display a list of files (any kind, any extension), each with a connected button.
when the user push the button, I would like to send to the server just the user's email and the selected file name.
The server must then build the real path and is then able to retrieve the file and return it to the server which should store it as in any normal download (maybe asking the user in which location it want to store the file)
I'm using Axios on the client and express on the server.
I'm not able to realize this architecture:
If I use an 'a' tag, as suggested in several sites, it seems that the entire download is managed by the client, so I have to put the entire path of the file to download, and I don't want to show it.
Have someone an idea on how to approach and solve the problem?
Thank you
Paolo

stripe custom success page client side

In the documentation they show how to do it with server-side, however, I'm using a shared hosting so I can't install the webhook libraries or server-side libraries (node, php or whatever). I want to do it manually, but I don't know if there's a way for that. The idea is to send the query (post or get) to my successpage and from there read what was sent or any workaround to validate payment and take an automatic action.
Thanks,

Recommended practices when developing full-stack applications based on Node.js and AWS

I've been working on the front-end so far, now I'm going to create my first full-stack application. I want to use node.js, express and AWS for this.
At the design stage, I already encountered a few problems. Therefore, I have a few questions and I am asking you for help:
Can I send a message (simple JSON or database value) from the server to all clients who have already opened my home page in a simple and cheap way?
I'm not talking about logged in users, but all who downloaded the main page (GET, '/')?
Using the admin panel ('www.xxxxxxxxx/admin'), I want to send a message to the server once a day. Then I want to change the HTML to display this message. I was thinking to use EJS for this and download this message from the database.
Can I make it better? If someone visits my home page (GET, '/'), EJS will download the message from the database each time! Even though its value is the same for 24 hours. Can I get the value once and then use it until the value is changed? How to store the message? As a JSON on the server? Or maybe in the .env file?
If the user refreshes the page, do I have to pay for calling all AWS functions to build the page each time? Even if nothing has changed in the files?
How to check if the page has new content and then send it to the user, instead of sending the unchanged page files: .html, .js, .css, etc.?
Can I send the user only the changed, dynamically created html file, and not send again unchanged .js and .css files?
Does every user who opens the home page (GET, '/') create a new connection to the server using WebSocket / socket.io?
I will try to answer some of your questions:
Can I send a message (simple JSON or database value) from the server to all clients who have already opened my home page in a simple
and cheap way? I'm not talking about logged in users, but all who
downloaded the main page (GET, '/')?
I guess you mean sending push notifications from the server to the user. This can be done with different services depending on what are you trying to build.
If you are planning to use GraphQL, you already have GraphQL subscriptions out of the box. If you are using AWS, go for Appsync, which is the AWS service for GraphQL.
If you are using REST and a WebApp (not a mobile app), go for AWS IoT using lambdas. Here is a good resource using Serverless Framework (API Gateway + lambdas + IoT) for unauthenticated users: https://www.serverless.com/blog/serverless-notifications-on-aws
If you are planning to use notifications on a mobile app, you can go for SNS, the "de facto" service for push notifications in AWS world.
Using the admin panel ('www.xxxxxxxxx/admin'), I want to send a message to the server once a day. Then I want to change the HTML to display this message. I was thinking to use EJS for this and download this message from the database. Can I make it better? If someone visits my home page (GET, '/'), EJS will download the message from the database each time! Even though its value is the same for 24 hours. Can I get the value once and then use it until the value is changed? How to store the message? As a JSON on the server? Or maybe in the .env file?
Yes, this is the way it's expected to work. The HTML is changed dynamically using frontend code in Javascript; which makes calls (using axios for example) to the backend every time you get into, i.e. "/" path. You can store this data in frontend variables, or even use state management in the frontend using REDUX, VUEX, etc. Remember the frontend code will always run in the browser of your users, not on your servers!
If the user refreshes the page, do I have to pay for calling all AWS functions to build the page each time? Even if nothing has changed in the files?
What you can do is store all your HTML, CSS, Javascript in an S3 bucket and serve from there (this is super cheap, even free till a certain limit). If you want to use Server Side Rendering (SSR), then yes, you'll need to serve your users every time they make a GET request for example. If you use lambda, the first million request per month are free. If you have an EC2 instance to serve your content, then a t2.micro is also free. If you need more than that, you'll need to pay.
How to check if the page has new content and then send it to the user, instead of sending the unchanged page files: .html, .js, .css, etc.?
I think you need to understand how JS (or frameworks like React, Vue or Angular) do this. Basically you download the js code on the client, and the js makes all the functionality to update backend and frontend accordingly. In order to connect frontend with backend, use Axios for example.
Can I send the user only the changed, dynamically created html file, and not send again unchanged .js and .css files?
See answer above. Use frameworks like React or Vue, will help you a lot.
Does every user who opens the home page (GET, '/') create a new connection to the server using WebSocket / socket.io?
Depends on what you code. But by default what happens is the user will make a new GET request everytime he accesses your domain, and that's it. (It's not establishing any connection if you don't tell the code to do so).
Hope this helps!! Happy coding!

Client Only and Tokens?

to access/write to a feed from the browser / Javascript, this answer says that you have to
Generate a token on the server (using API key+secret),
Provide that token to the client (just render it somewhere)
Use the token from in JS when accessing the feed
My problem now is that I basically have no server side. My app uses Polymer, so everything is running on the client and I have no way of creating those tokens (my app is served through Firebase, and I guess all it does is serve the html files).
With the polymer/firebase setup, can I still use getstream.io somehow?
Thanks!
We don't have any interaction with Firebase directly, so you'd still need some piece of middleware to handle API calls and generating these tokens.
It's an interesting idea, though. I'll add a TODO item to look into Firebase interactivity via a plugin in the future.

Nodejs encrypted comunnication with frontend (javascript)

I am sending a JSON with some important data to the frontend using Nodejs.
If i enter in the explorer the url of the JSON i am requesting the json data is displayed.
Also, if i firebug the website i am able to view the POST or GET requests with that important data.
I need a way of communicating with from backend to frontend but being encrypted so that nobody can never see that important data.
I am thinking of using google fusion tables (excel in the cloud) to achieve this, but i am sure there must be a simpler solution.
Regards,

Resources