You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.6 KiB
51 lines
1.6 KiB
3 years ago
|
import {Authenticatable, AuthenticatableIdentifier} from '../../types'
|
||
|
import {OAuth2LoginConfig} from './OAuth2LoginController'
|
||
|
import {Awaitable, dataGetUnsafe, InvalidJSONStateError, JSONState} from '../../../util'
|
||
|
|
||
|
export class OAuth2User implements Authenticatable {
|
||
|
protected displayField: string
|
||
|
|
||
|
protected identifierField: string
|
||
|
|
||
|
constructor(
|
||
|
protected data: {[key: string]: any},
|
||
|
config: OAuth2LoginConfig,
|
||
|
) {
|
||
|
this.displayField = config.userEndpointResponseMapping?.display || 'name'
|
||
|
this.identifierField = config.userEndpointResponseMapping?.identifier || 'id'
|
||
|
}
|
||
|
|
||
|
getDisplayIdentifier(): string {
|
||
|
return String(dataGetUnsafe(this.data, this.displayField || 'name', ''))
|
||
|
}
|
||
|
|
||
|
getIdentifier(): AuthenticatableIdentifier {
|
||
|
return String(dataGetUnsafe(this.data, this.identifierField || 'id', ''))
|
||
|
}
|
||
|
|
||
|
async dehydrate(): Promise<JSONState> {
|
||
|
return {
|
||
|
isOAuth2User: true,
|
||
|
data: this.data,
|
||
|
displayField: this.displayField,
|
||
|
identifierField: this.identifierField,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
rehydrate(state: JSONState): Awaitable<void> {
|
||
|
if (
|
||
|
!state.isOAuth2User
|
||
|
|| typeof state.data !== 'object'
|
||
|
|| state.data === null
|
||
|
|| typeof state.displayField !== 'string'
|
||
|
|| typeof state.identifierField !== 'string'
|
||
|
) {
|
||
|
throw new InvalidJSONStateError('OAuth2User state is invalid', { state })
|
||
|
}
|
||
|
|
||
|
this.data = state.data
|
||
|
this.identifierField = state.identifierField
|
||
|
this.displayField = state.identifierField
|
||
|
}
|
||
|
}
|