fix(#699): auth token
parent
888ac35156
commit
fc3a3c052c
@ -1,15 +1,46 @@ |
|||||||
<!DOCTYPE html> |
<!DOCTYPE html> |
||||||
<html lang="en"> |
<html lang="en"> |
||||||
|
|
||||||
<head> |
<head> |
||||||
<title></title> |
<title></title> |
||||||
</head> |
</head> |
||||||
|
|
||||||
<body> |
<body> |
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/oidc-client/1.11.5/oidc-client.min.js" integrity="sha512-pGtU1n/6GJ8fu6bjYVGIOT9Dphaw5IWPwVlqkpvVgqBxFkvdNbytUh0H8AP15NYF777P4D3XEeA/uDWFCpSQ1g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
<script src="https://cdnjs.cloudflare.com/ajax/libs/oidc-client/1.11.5/oidc-client.min.js" |
||||||
|
integrity="sha512-pGtU1n/6GJ8fu6bjYVGIOT9Dphaw5IWPwVlqkpvVgqBxFkvdNbytUh0H8AP15NYF777P4D3XEeA/uDWFCpSQ1g==" |
||||||
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
||||||
<script> |
<script> |
||||||
new Oidc.UserManager().signinSilentCallback() |
new Oidc.UserManager().signinSilentCallback() |
||||||
.catch((err) => { |
.then(() => { |
||||||
console.error('OIDC: silent refresh callback error', err); |
const refreshToken = new URLSearchParams(document.location.search).get('refresh_token'); |
||||||
}); |
|
||||||
|
if (refreshToken && /iPad|iPhone|iPod/.test(navigator.userAgent)) { |
||||||
|
const getDomain = () => { |
||||||
|
if (! '%NODE_ENV%' || '%NODE_ENV%' === 'development') { |
||||||
|
return 'localhost'; |
||||||
|
} else { |
||||||
|
return '.insports.tv'; |
||||||
|
} |
||||||
|
}; |
||||||
|
const parseJwt = (value) => { |
||||||
|
const base64Url = value.split('.')[1]; |
||||||
|
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); |
||||||
|
const jsonPayload = decodeURIComponent(window.atob(base64).split('').map((c) => `%${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)}`).join('')); |
||||||
|
|
||||||
|
return JSON.parse(jsonPayload); |
||||||
|
}; |
||||||
|
const saveRefreshToken = (value) => { |
||||||
|
const ref = parseJwt(value); |
||||||
|
const expires = `expires=${new Date((ref.exp * 1000)).toUTCString()}`; |
||||||
|
document.cookie = `refresh_token=${value};${expires};path=/;domain=${getDomain()};secure;SameSite=None`; |
||||||
|
}; |
||||||
|
saveRefreshToken(refreshToken); |
||||||
|
} |
||||||
|
}) |
||||||
|
.catch((err) => { |
||||||
|
console.error('OIDC: silent refresh callback error', err); |
||||||
|
}); |
||||||
</script> |
</script> |
||||||
</body> |
</body> |
||||||
</html> |
|
||||||
|
</html> |
||||||
@ -0,0 +1,51 @@ |
|||||||
|
import { AUTH_SERVICE } from 'config' |
||||||
|
import { ClientIds } from 'config/clients/types' |
||||||
|
|
||||||
|
export type TokenFailedResponse = { |
||||||
|
error?: { |
||||||
|
code: number, |
||||||
|
message: string, |
||||||
|
}, |
||||||
|
ok: false, |
||||||
|
} |
||||||
|
|
||||||
|
type TokenResponse = { |
||||||
|
access_token: string, |
||||||
|
id_token: string, |
||||||
|
refresh_token: string, |
||||||
|
} |
||||||
|
|
||||||
|
type TokenProps = { |
||||||
|
client_id: ClientIds, |
||||||
|
email?: 'string', |
||||||
|
grant_type?: 'password' | 'refresh_token', |
||||||
|
id_token?: 'string', |
||||||
|
password?: 'string', |
||||||
|
refresh_token: string, |
||||||
|
} |
||||||
|
|
||||||
|
export const getCredentials = async ({ |
||||||
|
client_id, |
||||||
|
grant_type = 'refresh_token', |
||||||
|
refresh_token, |
||||||
|
}: TokenProps): Promise<TokenResponse> => { |
||||||
|
const url = new URL(`${AUTH_SERVICE}/token`) |
||||||
|
|
||||||
|
const credetials = await fetch(url, { |
||||||
|
body: JSON.stringify({ |
||||||
|
client_id, |
||||||
|
grant_type, |
||||||
|
refresh_token, |
||||||
|
}), |
||||||
|
headers: { |
||||||
|
'Content-Type': 'application/json', |
||||||
|
}, |
||||||
|
method: 'POST', |
||||||
|
}) |
||||||
|
|
||||||
|
const body: TokenResponse | TokenFailedResponse = await credetials.json() |
||||||
|
|
||||||
|
if ('ok' in body) return Promise.reject(body.error) |
||||||
|
|
||||||
|
return Promise.resolve(body) |
||||||
|
} |
||||||
Loading…
Reference in new issue