Skip to content

Commit 55cdf60

Browse files
committed
service account impersonation
1 parent 8c685c7 commit 55cdf60

File tree

5 files changed

+19
-35
lines changed

5 files changed

+19
-35
lines changed

www/src/components/account/User.tsx

+10-15
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ import { Button, Span } from 'honorable'
1010
import { useContext, useMemo, useState } from 'react'
1111

1212
import CurrentUserContext from '../../contexts/CurrentUserContext'
13-
import { Permission, useUpdateUserMutation } from '../../generated/graphql'
13+
import {
14+
Permission,
15+
useImpersonateServiceAccountMutation,
16+
useUpdateUserMutation,
17+
} from '../../generated/graphql'
1418
import {
1519
fetchToken,
1620
setPreviousUserData,
@@ -25,6 +29,7 @@ import { EditServiceAccount } from './CreateServiceAccount'
2529
import { MoreMenu } from './MoreMenu'
2630
import { IMPERSONATE_SERVICE_ACCOUNT } from './queries'
2731
import { hasRbac } from './utils'
32+
import useImpersonatedServiceAccount from '../../hooks/useImpersonatedServiceAccount'
2833

2934
export function UserInfo({
3035
user: { email, name, avatar },
@@ -185,21 +190,11 @@ export function User({ user, update }: any) {
185190
export function ServiceAccount({ user, update }: any) {
186191
const me = useContext(CurrentUserContext)
187192
const editable = canEdit(me, me.account) || hasRbac(me, Permission.Users)
188-
const [mutation, { error }] = useMutation(IMPERSONATE_SERVICE_ACCOUNT, {
193+
const [mutation, { error }] = useImpersonateServiceAccountMutation({
189194
variables: { id: user.id },
190-
update: (
191-
_cache,
192-
{
193-
data: {
194-
impersonateServiceAccount: { jwt },
195-
},
196-
}
197-
) => {
198-
setPreviousUserData({
199-
me,
200-
jwt: fetchToken(),
201-
})
202-
setToken(jwt)
195+
update: (_cache, { data }) => {
196+
setPreviousUserData({ me, jwt: fetchToken() })
197+
setToken(data?.impersonateServiceAccount?.jwt)
203198
;(window as Window).location = '/'
204199
},
205200
})

www/src/components/account/queries.ts

-8
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,6 @@ export const AUDITS_Q = gql`
177177
${AuditFragment}
178178
`
179179

180-
export const IMPERSONATE_SERVICE_ACCOUNT = gql`
181-
mutation Impersonate($id: ID) {
182-
impersonateServiceAccount(id: $id) {
183-
jwt
184-
}
185-
}
186-
`
187-
188180
export const DNS_DOMAINS = gql`
189181
query Domains($cursor: String) {
190182
dnsDomains(after: $cursor, first: 50) {

www/src/generated/graphql.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -6156,6 +6156,7 @@ export type LoginMutationVariables = Exact<{
61566156
export type LoginMutation = { __typename?: 'RootMutationType', login?: { __typename?: 'User', jwt?: string | null } | null };
61576157

61586158
export type ImpersonateServiceAccountMutationVariables = Exact<{
6159+
id?: InputMaybe<Scalars['ID']['input']>;
61596160
email?: InputMaybe<Scalars['String']['input']>;
61606161
}>;
61616162

@@ -11362,8 +11363,8 @@ export type LoginMutationHookResult = ReturnType<typeof useLoginMutation>;
1136211363
export type LoginMutationResult = Apollo.MutationResult<LoginMutation>;
1136311364
export type LoginMutationOptions = Apollo.BaseMutationOptions<LoginMutation, LoginMutationVariables>;
1136411365
export const ImpersonateServiceAccountDocument = gql`
11365-
mutation ImpersonateServiceAccount($email: String) {
11366-
impersonateServiceAccount(email: $email) {
11366+
mutation ImpersonateServiceAccount($id: ID, $email: String) {
11367+
impersonateServiceAccount(id: $id, email: $email) {
1136711368
jwt
1136811369
email
1136911370
}
@@ -11384,6 +11385,7 @@ export type ImpersonateServiceAccountMutationFn = Apollo.MutationFunction<Impers
1138411385
* @example
1138511386
* const [impersonateServiceAccountMutation, { data, loading, error }] = useImpersonateServiceAccountMutation({
1138611387
* variables: {
11388+
* id: // value for 'id'
1138711389
* email: // value for 'email'
1138811390
* },
1138911391
* });

www/src/graph/users.graphql

+2-2
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,8 @@ mutation Login(
251251
}
252252
}
253253

254-
mutation ImpersonateServiceAccount($email: String) {
255-
impersonateServiceAccount(email: $email) {
254+
mutation ImpersonateServiceAccount($id: ID, $email: String) {
255+
impersonateServiceAccount(id: $id, email: $email) {
256256
jwt
257257
email
258258
}

www/src/hooks/useImpersonatedServiceAccount.tsx

+3-8
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,11 @@ import memoize from 'lodash/memoize'
55
import { buildClient, client as defaultClient } from '../helpers/client'
66
import { IMPERSONATE_SERVICE_ACCOUNT } from '../components/account/queries'
77
import { fetchToken } from '../helpers/authentication'
8+
import { useImpersonateServiceAccountMutation } from '../generated/graphql'
89

910
// Cache tokens with service account ID as keys.
1011
const getImpersonatedToken = memoize((id, mutation) =>
11-
mutation().then(
12-
({
13-
data: {
14-
impersonateServiceAccount: { jwt },
15-
},
16-
}) => jwt
17-
)
12+
mutation().then(({ data }) => data?.impersonateServiceAccount?.jwt)
1813
)
1914

2015
// Cache clients with impersonated service account tokens as keys.
@@ -26,7 +21,7 @@ export default function useImpersonatedServiceAccount(
2621
) {
2722
const [client, setClient] = useState<ApolloClient<unknown> | undefined>()
2823
const [token, setToken] = useState<any | undefined>()
29-
const [mutation, { error }] = useMutation(IMPERSONATE_SERVICE_ACCOUNT, {
24+
const [mutation, { error }] = useImpersonateServiceAccountMutation({
3025
variables: { id },
3126
})
3227

0 commit comments

Comments
 (0)