isAuthenticated state , , . ! :)
, , access_token ( ) localStorage cookies localStorage . access_token , access_token , . access_token , , , , , .
access_token , .
access_token refresh_token - , , .
, , OAuth2, . OAuth2 , . , 1) access_token, , 2) refresh_token, (, ). access_token access_token , , , refresh_token , access_token .
cookies localStorage - !
localStorage - . /, access_token . . /, , expires, .
, cookies expires, , . cookies - , , js-cookie, cookies.
cookies: - ! login.mycompany.com - app.mycompany.com, cookie . LocalStorage.
React, :
isAuthenticated()
import Cookies from 'js-cookie'
export const getAccessToken = () => Cookies.get('access_token')
export const getRefreshToken = () => Cookies.get('refresh_token')
export const isAuthenticated = () => !!getAccessToken()
()
export const authenticate = async () => {
if (getRefreshToken()) {
try {
const tokens = await refreshTokens()
const expires = (tokens.expires_in || 60 * 60) * 1000
const inOneHour = new Date(new Date().getTime() + expires)
Cookies.set('access_token', tokens.access_token, { expires: inOneHour })
Cookies.set('refresh_token', tokens.refresh_token)
return true
} catch (error) {
redirectToLogin()
return false
}
}
redirectToLogin()
return false
}
redirectToLogin()
const redirectToLogin = () => {
window.location.replace(
'${getConfig().LOGIN_URL}?next=${window.location.href}'
)
// or history.push('/login') if your Login page is inside the same app
}
AuthenticatedRoute
export const AuthenticatedRoute = ({
component: Component,
exact,
path,
}) => (
<Route
exact={exact}
path={path}
render={props =>
isAuthenticated() ? (
<Component {...props} />
) : (
<AuthenticateBeforeRender render={() => <Component {...props} />} />
)
}
/>
)
AuthenticateBeforeRender
class AuthenticateBeforeRender extends Component {
state = {
isAuthenticated: false,
}
componentDidMount() {
authenticate().then(isAuthenticated => {
this.setState({ isAuthenticated })
})
}
render() {
return this.state.isAuthenticated ? this.props.render() : null
}
}