Skip to content

Commit 154c127

Browse files
authored
fix: Java doc for DefaultPKCEProvider.java (#1148)
* fix: Java doc for DefaultPKCEProvider.java
1 parent 35495b1 commit 154c127

File tree

2 files changed

+95
-31
lines changed

2 files changed

+95
-31
lines changed

oauth2_http/java/com/google/auth/oauth2/DefaultPKCEProvider.java

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,40 +36,16 @@
3636
import java.security.SecureRandom;
3737
import java.util.Base64;
3838

39+
/**
40+
* Implements PKCE using only the Java standard library. See https://www.rfc-editor.org/rfc/rfc7636.
41+
*
42+
* <p>https://developers.google.com/identity/protocols/oauth2/native-app#step1-code-verifier.
43+
*/
3944
public class DefaultPKCEProvider implements PKCEProvider {
4045
private String codeVerifier;
4146
private CodeChallenge codeChallenge;
4247
private static final int MAX_CODE_VERIFIER_LENGTH = 127;
4348

44-
private class CodeChallenge {
45-
private String codeChallenge;
46-
private String codeChallengeMethod;
47-
48-
CodeChallenge(String codeVerifier) {
49-
try {
50-
byte[] bytes = codeVerifier.getBytes();
51-
MessageDigest md = MessageDigest.getInstance("SHA-256");
52-
md.update(bytes);
53-
54-
byte[] digest = md.digest();
55-
56-
this.codeChallenge = Base64.getUrlEncoder().encodeToString(digest);
57-
this.codeChallengeMethod = "S256";
58-
} catch (NoSuchAlgorithmException e) {
59-
this.codeChallenge = codeVerifier;
60-
this.codeChallengeMethod = "plain";
61-
}
62-
}
63-
64-
public String getCodeChallenge() {
65-
return codeChallenge;
66-
}
67-
68-
public String getCodeChallengeMethod() {
69-
return codeChallengeMethod;
70-
}
71-
}
72-
7349
private String createCodeVerifier() {
7450
SecureRandom sr = new SecureRandom();
7551
byte[] code = new byte[MAX_CODE_VERIFIER_LENGTH];
@@ -100,4 +76,34 @@ public String getCodeChallenge() {
10076
public String getCodeChallengeMethod() {
10177
return codeChallenge.getCodeChallengeMethod();
10278
}
79+
80+
/** Class representing the Code Challenge derived from a Code Verifier string. */
81+
private class CodeChallenge {
82+
private String codeChallenge;
83+
private String codeChallengeMethod;
84+
85+
CodeChallenge(String codeVerifier) {
86+
try {
87+
byte[] bytes = codeVerifier.getBytes();
88+
MessageDigest md = MessageDigest.getInstance("SHA-256");
89+
md.update(bytes);
90+
91+
byte[] digest = md.digest();
92+
93+
this.codeChallenge = Base64.getUrlEncoder().encodeToString(digest);
94+
this.codeChallengeMethod = "S256";
95+
} catch (NoSuchAlgorithmException e) {
96+
this.codeChallenge = codeVerifier;
97+
this.codeChallengeMethod = "plain";
98+
}
99+
}
100+
101+
public String getCodeChallenge() {
102+
return codeChallenge;
103+
}
104+
105+
public String getCodeChallengeMethod() {
106+
return codeChallengeMethod;
107+
}
108+
}
103109
}

oauth2_http/javatests/com/google/auth/oauth2/UserAuthorizerTest.java

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ public void revokeAuthorization_revokesAndClears() throws IOException {
477477
}
478478

479479
@Test(expected = IllegalArgumentException.class)
480-
public void illegalPKCEProvider() {
480+
public void nullCodeVerifierPKCEProvider() {
481481
PKCEProvider pkce =
482482
new PKCEProvider() {
483483
@Override
@@ -487,7 +487,36 @@ public String getCodeVerifier() {
487487

488488
@Override
489489
public String getCodeChallengeMethod() {
490-
return null;
490+
return "dummy string";
491+
}
492+
493+
@Override
494+
public String getCodeChallenge() {
495+
return "dummy string";
496+
}
497+
};
498+
499+
UserAuthorizer authorizer =
500+
UserAuthorizer.newBuilder()
501+
.setClientId(CLIENT_ID)
502+
.setScopes(DUMMY_SCOPES)
503+
.setTokenStore(new MemoryTokensStorage())
504+
.setPKCEProvider(pkce)
505+
.build();
506+
}
507+
508+
@Test(expected = IllegalArgumentException.class)
509+
public void nullCodeChallengePKCEProvider() {
510+
PKCEProvider pkce =
511+
new PKCEProvider() {
512+
@Override
513+
public String getCodeVerifier() {
514+
return "dummy string";
515+
}
516+
517+
@Override
518+
public String getCodeChallengeMethod() {
519+
return "dummy string";
491520
}
492521

493522
@Override
@@ -504,4 +533,33 @@ public String getCodeChallenge() {
504533
.setPKCEProvider(pkce)
505534
.build();
506535
}
536+
537+
@Test(expected = IllegalArgumentException.class)
538+
public void nullCodeChallengeMethodPKCEProvider() {
539+
PKCEProvider pkce =
540+
new PKCEProvider() {
541+
@Override
542+
public String getCodeVerifier() {
543+
return "dummy string";
544+
}
545+
546+
@Override
547+
public String getCodeChallengeMethod() {
548+
return null;
549+
}
550+
551+
@Override
552+
public String getCodeChallenge() {
553+
return "dummy string";
554+
}
555+
};
556+
557+
UserAuthorizer authorizer =
558+
UserAuthorizer.newBuilder()
559+
.setClientId(CLIENT_ID)
560+
.setScopes(DUMMY_SCOPES)
561+
.setTokenStore(new MemoryTokensStorage())
562+
.setPKCEProvider(pkce)
563+
.build();
564+
}
507565
}

0 commit comments

Comments
 (0)