@@ -9,6 +9,11 @@ import au.org.ala.ws.security.JwtProperties
9
9
import au.org.ala.ws.tokens.TokenService
10
10
import com.amazonaws.AmazonWebServiceResult
11
11
import com.amazonaws.ResponseMetadata
12
+ import com.amazonaws.services.apigateway.AmazonApiGateway
13
+ import com.amazonaws.services.apigateway.model.CreateApiKeyRequest
14
+ import com.amazonaws.services.apigateway.model.CreateUsagePlanKeyRequest
15
+ import com.amazonaws.services.apigateway.model.GetApiKeysRequest
16
+ import com.amazonaws.services.apigateway.model.GetApiKeysResult
12
17
import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProvider
13
18
import com.amazonaws.services.cognitoidp.model.AddCustomAttributesRequest
14
19
import com.amazonaws.services.cognitoidp.model.AdminAddUserToGroupRequest
@@ -24,7 +29,8 @@ import com.amazonaws.services.cognitoidp.model.AdminSetUserMFAPreferenceRequest
24
29
import com.amazonaws.services.cognitoidp.model.AdminUpdateUserAttributesRequest
25
30
import com.amazonaws.services.cognitoidp.model.AssociateSoftwareTokenRequest
26
31
import com.amazonaws.services.cognitoidp.model.AttributeType
27
- import com.amazonaws.services.cognitoidp.model.CreateGroupResult
32
+ import com.amazonaws.services.cognitoidp.model.CreateUserPoolClientRequest
33
+ import com.amazonaws.services.cognitoidp.model.CreateUserPoolClientResult
28
34
import com.amazonaws.services.cognitoidp.model.DescribeUserPoolRequest
29
35
import com.amazonaws.services.cognitoidp.model.CreateGroupRequest
30
36
import com.amazonaws.services.cognitoidp.model.GetGroupRequest
@@ -44,6 +50,7 @@ import com.amazonaws.services.cognitoidp.model.UserType
44
50
import com.nimbusds.oauth2.sdk.token.AccessToken
45
51
import com.amazonaws.services.cognitoidp.model.VerifySoftwareTokenRequest
46
52
import grails.converters.JSON
53
+ import grails.core.GrailsApplication
47
54
import grails.web.servlet.mvc.GrailsParameterMap
48
55
import groovy.util.logging.Slf4j
49
56
import org.apache.commons.lang3.NotImplementedException
@@ -64,6 +71,8 @@ class CognitoUserService implements IUserService<UserRecord, UserPropertyRecord,
64
71
AWSCognitoIdentityProvider cognitoIdp
65
72
String poolId
66
73
JwtProperties jwtProperties
74
+ AmazonApiGateway apiGatewayIdp
75
+ GrailsApplication grailsApplication
67
76
68
77
@Value (' ${attributes.affiliations.enabled:false}' )
69
78
boolean affiliationsEnabled = false
@@ -880,4 +889,78 @@ class CognitoUserService implements IUserService<UserRecord, UserPropertyRecord,
880
889
resultStreamer. complete()
881
890
}
882
891
892
+ @Override
893
+ Map generateApikey (String usagePlanId ) {
894
+ if (! usagePlanId){
895
+ return [apikeys :null , err : " No usage plan id to generate api key" ]
896
+ }
897
+
898
+ CreateApiKeyRequest request = new CreateApiKeyRequest ()
899
+ request. enabled = true
900
+ request. customerId = currentUser. userId
901
+ request. name = " API key for user " + currentUser. userId
902
+ def response = apiGatewayIdp. createApiKey(request)
903
+
904
+ if (isSuccessful(response)) {
905
+ // add api key to usage plan
906
+ CreateUsagePlanKeyRequest usagePlanKeyRequest = new CreateUsagePlanKeyRequest ()
907
+ usagePlanKeyRequest. keyId = response. id
908
+ usagePlanKeyRequest. keyType = " API_KEY"
909
+ usagePlanKeyRequest. usagePlanId = usagePlanId
910
+ apiGatewayIdp. createUsagePlanKey(usagePlanKeyRequest)
911
+
912
+ return [apikeys :getApikeys(currentUser. userId), error : null ]
913
+ }
914
+ else {
915
+ return [apikeys :null , error : " Could not generate api key" ]
916
+ }
917
+ }
918
+
919
+ @Override
920
+ def getApikeys (String userId ) {
921
+
922
+ GetApiKeysRequest getApiKeysRequest = new GetApiKeysRequest (). withCustomerId(userId). withIncludeValues(true )
923
+ GetApiKeysResult response = apiGatewayIdp. getApiKeys(getApiKeysRequest)
924
+ if (isSuccessful(response)){
925
+ return response. items. value
926
+ }
927
+ else {
928
+ return null
929
+ }
930
+ }
931
+
932
+ @Override
933
+ def generateClient (String userId , List<String > callbackURLs , boolean forGalah ){
934
+ CreateUserPoolClientRequest request = new CreateUserPoolClientRequest (). withUserPoolId(poolId)
935
+ request. clientName = " Client for user " + userId
936
+ request. allowedOAuthFlows = [" code" ]
937
+ request. generateSecret = false
938
+ request. supportedIdentityProviders = [" COGNITO" , " Facebook" , " Google" , " AAF" ] // "SignInWithApple"
939
+ request. preventUserExistenceErrors = " ENABLED"
940
+ request. explicitAuthFlows = [" ALLOW_REFRESH_TOKEN_AUTH" , " ALLOW_CUSTOM_AUTH" , " ALLOW_USER_SRP_AUTH" , " ALLOW_USER_PASSWORD_AUTH" ]
941
+ request. allowedOAuthFlowsUserPoolClient = true
942
+
943
+ def scopes = grailsApplication. config. getProperty(' oauth.support.dynamic.client.scopes' , List , [])
944
+
945
+ if (scopes) {
946
+ request. allowedOAuthScopes = scopes
947
+ }
948
+
949
+ request. callbackURLs = callbackURLs
950
+ if (forGalah) {
951
+ request. callbackURLs. addAll(grailsApplication. config. getProperty(' oauth.support.dynamic.client.galah.callbackURLs' , List , []))
952
+ }
953
+
954
+ CreateUserPoolClientResult response = cognitoIdp. createUserPoolClient(request)
955
+
956
+ if (isSuccessful(response)){
957
+ // update user custom attribute with new clientId
958
+ addCustomUserProperty(currentUser, " clientId" , response. userPoolClient. clientId)
959
+ return [apikeys : response. userPoolClient. clientId, error : null ]
960
+ }
961
+ else {
962
+ return [clientId : null , error : " Could not generate client" ]
963
+ }
964
+ }
965
+
883
966
}
0 commit comments