fix(#699): auth token
parent
888ac35156
commit
fc3a3c052c
@ -1,15 +1,46 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
|
||||
<head> |
||||
<title></title> |
||||
</head> |
||||
|
||||
<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> |
||||
new Oidc.UserManager().signinSilentCallback() |
||||
.then(() => { |
||||
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> |
||||
</body> |
||||
|
||||
</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