The function is based on this post: Authenticating a user in server-side routes - #5 by jamgold
const getUserIdFromToken = loginToken => {
const user = Meteor.users.findOne(
{ 'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(loginToken) },
{ fields: { _id: 1 } }
);
if (user) {
return { response: 'success', message: user._id };
}
return { response: 'error', message: 'noUser' };
};
The loginToken is stored in cookies by the serviceWorker:
import { Meteor } from 'meteor/meteor';
import { Accounts } from 'meteor/accounts-base';
import { Cookies } from 'meteor/ostrio:cookies';
Meteor.startup(() => {
Accounts.onLogin(user => {
const cookies = new Cookies();
cookies.set('meteor_login_token', user.token);
});
navigator.serviceWorker
.register('/sw.js', { scope: '/pwa' })
.catch(error => {
console.log('ServiceWorker registration failed: ', error);
});
});
The share target is definedin in the manifest:
"share_target": {
"action": "./pwaShareChecklistImage",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"files": [{
"name": "file",
"accept": ["image/*"]
}]
}
}
To get the userId from the WebApp endpoint:
WebApp.connectHandlers.use('/pwaShareChecklistImage', (req, res, next) => {
const loginToken = req.cookies?.meteor_login_token;
const { response, message } = getUserIdFromToken(loginToken);
}