accounts-frontend/src/services/api/authentication.js

145 lines
4.1 KiB
JavaScript
Raw Normal View History

2017-08-23 00:09:08 +05:30
// @flow
import logger from 'services/logger';
import request, { InternalServerError } from 'services/request';
import accounts from 'services/api/accounts';
2016-11-05 15:41:41 +05:30
const authentication = {
login({
2017-08-23 00:09:08 +05:30
login,
password,
totp,
rememberMe = false
2017-08-23 00:09:08 +05:30
}: {
login: string,
password?: string,
totp?: string,
rememberMe: bool
}) {
return request.post(
'/api/authentication/login',
2017-09-09 19:52:19 +05:30
{login, password, totp, rememberMe},
{token: null}
2017-09-09 19:52:19 +05:30
);
},
/**
* @param {object} options
2017-08-23 00:09:08 +05:30
* @param {string} [options.token] - an optional token to overwrite headers
* in middleware and disable token auto-refresh
*
* @return {Promise}
*/
2017-08-23 00:09:08 +05:30
logout(options: {
token?: string
} = {}) {
return request.post('/api/authentication/logout', {}, {
token: options.token
});
},
2016-07-28 10:33:30 +05:30
forgotPassword({
2017-08-23 00:09:08 +05:30
login,
captcha
}: {
login: string,
captcha: string
2016-07-28 10:33:30 +05:30
}) {
return request.post(
'/api/authentication/forgot-password',
{login, captcha},
{token: null}
2016-07-28 10:33:30 +05:30
);
},
recoverPassword({
2017-08-23 00:09:08 +05:30
key,
newPassword,
newRePassword
}: {
key: string,
newPassword: string,
newRePassword: string
2016-07-28 10:33:30 +05:30
}) {
return request.post(
'/api/authentication/recover-password',
{key, newPassword, newRePassword},
{token: null}
2016-07-28 10:33:30 +05:30
);
},
/**
* Resolves if token is valid
*
* @param {object} options
* @param {string} options.token
* @param {string} options.refreshToken
*
* @return {Promise} - resolves with options.token or with a new token
* if it was refreshed. As a side effect the response
* will have a `user` field with current user data
*/
2017-08-23 00:09:08 +05:30
validateToken({token, refreshToken}: {
token: string,
refreshToken: string
}) {
2016-11-05 15:41:41 +05:30
return new Promise((resolve) => {
if (typeof token !== 'string') {
throw new Error('token must be a string');
}
resolve();
})
.then(() => accounts.current({token}))
.then((user) => ({token, refreshToken, user}))
.catch((resp) => {
if (resp instanceof InternalServerError) {
// delegate error recovering to the bsod middleware
return new Promise(() => {});
}
if (['Token expired', 'Incorrect token'].includes(resp.message)) {
return authentication.requestToken(refreshToken)
.then(({token}) =>
accounts.current({token})
.then((user) => ({token, refreshToken, user}))
)
.catch((error) => {
logger.error('Failed refreshing token during token validation', {
error
});
return Promise.reject(error);
});
}
const errors = resp.errors || {};
if (errors.refresh_token !== 'error.refresh_token_not_exist') {
logger.error('Unexpected error during token validation', {
resp
});
}
2016-11-05 15:41:41 +05:30
return Promise.reject(resp);
});
},
2016-08-10 00:47:49 +05:30
/**
* Request new access token using a refreshToken
*
* @param {string} refreshToken
*
* @return {Promise} - resolves to {token}
*/
2017-08-23 00:09:08 +05:30
requestToken(refreshToken: string): Promise<{token: string}> {
return request.post(
'/api/authentication/refresh-token',
{refresh_token: refreshToken}, // eslint-disable-line
{token: null}
2017-08-23 00:09:08 +05:30
).then((resp: {access_token: string}) => ({
2016-08-10 00:47:49 +05:30
token: resp.access_token
}));
}
};
2016-11-05 15:41:41 +05:30
export default authentication;