66
77import java .net .URI ;
88import java .net .URISyntaxException ;
9+ import java .net .URLEncoder ;
910import java .net .http .HttpClient ;
1011import java .net .http .HttpRequest ;
1112import java .net .http .HttpResponse ;
13+ import java .nio .charset .StandardCharsets ;
1214import java .util .Base64 ;
15+ import java .util .HashMap ;
1316import java .util .List ;
17+ import java .util .Map ;
1418import java .util .concurrent .CompletableFuture ;
1519import java .util .Arrays ;
1620import java .util .concurrent .TimeUnit ;
21+ import java .util .stream .Collectors ;
1722
1823public class AuthsignalClient {
1924 private String _secret ;
@@ -22,7 +27,7 @@ public class AuthsignalClient {
2227
2328 private static final String DEFAULT_API_URL = "https://api.authsignal.com/v1" ;
2429 private static final int DEFAULT_RETRIES = 2 ;
25- private static final String VERSION = "2.4 .0" ;
30+ private static final String VERSION = "2.5 .0" ;
2631
2732 public Webhook webhook ;
2833
@@ -114,6 +119,73 @@ public CompletableFuture<ActionAttributes> updateAction(UpdateActionRequest requ
114119 .thenApply (response -> new Gson ().fromJson (response .body (), ActionAttributes .class ));
115120 }
116121
122+ public CompletableFuture <ChallengeResponse > challenge (ChallengeRequest request ) {
123+ return postRequest ("/challenge" , new Gson ().toJson (request ))
124+ .thenApply (response -> new Gson ().fromJson (response .body (), ChallengeResponse .class ));
125+ }
126+
127+ public CompletableFuture <VerifyResponse > verify (VerifyRequest request ) {
128+ return postRequest ("/verify" , new Gson ().toJson (request ))
129+ .thenApply (response -> new Gson ().fromJson (response .body (), VerifyResponse .class ));
130+ }
131+
132+ public CompletableFuture <ClaimChallengeResponse > claimChallenge (ClaimChallengeRequest request ) {
133+ return postRequest ("/claim" , new Gson ().toJson (request ))
134+ .thenApply (response -> new Gson ().fromJson (response .body (), ClaimChallengeResponse .class ));
135+ }
136+
137+ public CompletableFuture <GetChallengeResponse > getChallenge (GetChallengeRequest request ) {
138+ Map <String , String > params = new HashMap <>();
139+
140+ if (request .challengeId != null ) {
141+ params .put ("challengeId" , request .challengeId );
142+ }
143+
144+ if (request .userId != null ) {
145+ params .put ("userId" , request .userId );
146+ }
147+
148+ if (request .action != null ) {
149+ params .put ("action" , request .action );
150+ }
151+
152+ if (request .verificationMethod != null ) {
153+ params .put ("verificationMethod" , request .verificationMethod );
154+ }
155+
156+ String query = buildQueryString (params );
157+
158+ String path = "/challenges" + query ;
159+
160+ return postRequest (path , new Gson ().toJson (request ))
161+ .thenApply (response -> new Gson ().fromJson (response .body (), GetChallengeResponse .class ));
162+ }
163+
164+ public CompletableFuture <CreateSessionResponse > createSession (CreateSessionRequest request ) {
165+ return postRequest ("/sessions" , new Gson ().toJson (request ))
166+ .thenApply (response -> new Gson ().fromJson (response .body (), CreateSessionResponse .class ));
167+ }
168+
169+ public CompletableFuture <ValidateSessionResponse > validateSession (ValidateSessionRequest request ) {
170+ return postRequest ("/sessions/validate" , new Gson ().toJson (request ))
171+ .thenApply (response -> new Gson ().fromJson (response .body (), ValidateSessionResponse .class ));
172+ }
173+
174+ public CompletableFuture <RefreshSessionResponse > refreshSession (RefreshSessionRequest request ) {
175+ return postRequest ("/sessions/refresh" , new Gson ().toJson (request ))
176+ .thenApply (response -> new Gson ().fromJson (response .body (), RefreshSessionResponse .class ));
177+ }
178+
179+ public CompletableFuture <Void > revokeSession (RevokeSessionRequest request ) {
180+ return postRequest ("/sessions/revoke" , new Gson ().toJson (request ))
181+ .thenApply (response -> null );
182+ }
183+
184+ public CompletableFuture <Void > revokeUserSessions (RevokeUserSessionsRequest request ) {
185+ return postRequest ("/sessions/revoke-user" , new Gson ().toJson (request ))
186+ .thenApply (response -> null );
187+ }
188+
117189 private CompletableFuture <HttpResponse <String >> getRequest (String path ) {
118190 try {
119191 URI uri = new URI (_baseURL + path );
@@ -276,4 +348,10 @@ private boolean isSuccessResponse(int statusCode) {
276348 private boolean isServerErrorResponse (int statusCode ) {
277349 return statusCode >= 500 && statusCode <= 599 ;
278350 }
351+
352+ private String buildQueryString (Map <String , String > params ) {
353+ return params .entrySet ().stream ()
354+ .map (e -> e .getKey () + "=" + URLEncoder .encode (e .getValue (), StandardCharsets .UTF_8 ))
355+ .collect (Collectors .joining ("&" ));
356+ }
279357}
0 commit comments