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

163 lines
5.0 KiB
JavaScript
Raw Normal View History

// @flow
/* eslint camelcase: off */
2018-05-03 10:45:09 +05:30
import type { Resp } from 'services/request';
2018-05-05 14:31:25 +05:30
import type { ApplicationType } from 'components/dev/apps';
import request from 'services/request';
export type OauthAppResponse = {
clientId: string,
clientSecret: string,
2018-05-05 14:31:25 +05:30
type: ApplicationType,
name: string,
websiteUrl: string,
createdAt: number,
// fields for 'application' type
countUsers?: number,
description?: string,
redirectUri?: string,
// fields for 'minecraft-server' type
minecraftServerIp?: string,
};
2018-05-03 10:45:09 +05:30
type OauthRequestData = {
client_id: string,
redirect_uri: string,
response_type: string,
description: string,
scope: string,
prompt: string,
login_hint?: string,
state?: string,
};
export type OauthData = {
clientId: string,
redirectUrl: string,
responseType: string,
description: string,
scope: string,
prompt: 'none' | 'consent' | 'select_account',
loginHint?: string,
state?: string
};
type FormPayloads = {
name?: string,
description?: string,
websiteUrl?: string,
redirectUri?: string,
minecraftServerIp?: string,
};
const api = {
2018-05-03 10:45:09 +05:30
validate(oauthData: OauthData) {
return request.get(
2016-07-28 01:15:50 +05:30
'/api/oauth2/v1/validate',
getOAuthRequest(oauthData)
).catch(handleOauthParamsValidation);
},
2018-05-03 10:45:09 +05:30
complete(oauthData: OauthData, params: {accept?: bool} = {}): Promise<Resp<{
success: bool,
redirectUri: string,
}>> {
const query = request.buildQuery(getOAuthRequest(oauthData));
return request.post(
2016-07-28 01:15:50 +05:30
`/api/oauth2/v1/complete?${query}`,
typeof params.accept === 'undefined' ? {} : {accept: params.accept}
).catch((resp = {}) => {
if (resp.statusCode === 401 && resp.error === 'access_denied') {
// user declined permissions
return {
success: false,
2018-05-03 10:45:09 +05:30
redirectUri: resp.redirectUri,
originalResponse: resp.originalResponse,
};
}
if (resp.status === 401 && resp.name === 'Unauthorized') {
const error: Object = new Error('Unauthorized');
error.unauthorized = true;
throw error;
}
if (resp.statusCode === 401 && resp.error === 'accept_required') {
const error: Object = new Error('Permissions accept required');
error.acceptRequired = true;
throw error;
}
return handleOauthParamsValidation(resp);
});
},
2018-05-03 10:45:09 +05:30
create(type: string, formParams: FormPayloads): Promise<Resp<{success: bool, data: OauthAppResponse}>> {
return request.post(`/api/v1/oauth2/${type}`, formParams);
},
2018-05-03 10:45:09 +05:30
update(clientId: string, formParams: FormPayloads): Promise<Resp<{success: bool, data: OauthAppResponse}>> {
return request.put(`/api/v1/oauth2/${clientId}`, formParams);
},
2018-05-03 10:45:09 +05:30
getApp(clientId: string): Promise<Resp<OauthAppResponse>> {
return request.get(`/api/v1/oauth2/${clientId}`);
},
2018-05-03 10:45:09 +05:30
getAppsByUser(userId: number): Promise<Resp<Array<OauthAppResponse>>> {
return request.get(`/api/v1/accounts/${userId}/oauth2/clients`);
},
2018-05-03 10:45:09 +05:30
reset(clientId: string, regenerateSecret: bool = false): Promise<Resp<{success: bool, data: OauthAppResponse}>> {
return request.post(`/api/v1/oauth2/${clientId}/reset${regenerateSecret ? '?regenerateSecret' : ''}`);
},
2018-05-03 10:45:09 +05:30
delete(clientId: string): Promise<Resp<{success: bool}>> {
return request.delete(`/api/v1/oauth2/${clientId}`);
},
};
if (window.Cypress) {
window.oauthApi = api;
}
export default api;
/**
* @param {object} oauthData
* @param {string} oauthData.clientId
* @param {string} oauthData.redirectUrl
* @param {string} oauthData.responseType
* @param {string} oauthData.description
* @param {string} oauthData.scope
* @param {string} oauthData.state
*
* @return {object}
*/
2018-05-03 10:45:09 +05:30
function getOAuthRequest(oauthData: OauthData): OauthRequestData {
return {
client_id: oauthData.clientId,
redirect_uri: oauthData.redirectUrl,
response_type: oauthData.responseType,
description: oauthData.description,
scope: oauthData.scope,
prompt: oauthData.prompt,
login_hint: oauthData.loginHint,
state: oauthData.state
};
}
function handleOauthParamsValidation(resp = {}) {
if (resp.statusCode === 400 && resp.error === 'invalid_request') {
2016-08-07 20:20:00 +05:30
resp.userMessage = `Invalid request (${resp.parameter} required).`;
} else if (resp.statusCode === 400 && resp.error === 'unsupported_response_type') {
2016-08-07 20:20:00 +05:30
resp.userMessage = `Invalid response type '${resp.parameter}'.`;
} else if (resp.statusCode === 400 && resp.error === 'invalid_scope') {
2016-08-07 20:20:00 +05:30
resp.userMessage = `Invalid scope '${resp.parameter}'.`;
} else if (resp.statusCode === 401 && resp.error === 'invalid_client') {
2016-08-07 20:20:00 +05:30
resp.userMessage = 'Can not find application you are trying to authorize.';
}
2016-08-07 20:20:00 +05:30
return Promise.reject(resp);
}