2828 */
2929@ Getter
3030public class OAuthHandler {
31- private final OkHttpClient httpClient ;
31+ private OkHttpClient httpClient ;
3232 private final OAuthConfig config ;
3333 private final Gson gson ;
3434
@@ -55,14 +55,11 @@ public OAuthHandler(OkHttpClient httpClient, OAuthConfig config) {
5555 // Only generate PKCE codeVerifier if clientSecret is not provided
5656 if (config .getClientSecret () == null || config .getClientSecret ().trim ().isEmpty ()) {
5757 this .codeVerifier = generateCodeVerifier ();
58- // codeChallenge will be generated during authorize()
5958 this .codeChallenge = null ;
6059 }
6160 }
6261
63- /**
64- * Returns common headers for OAuth requests
65- */
62+
6663 private Request .Builder _getHeaders () {
6764 return new Request .Builder ()
6865 .header ("Content-Type" , "application/x-www-form-urlencoded" )
@@ -74,10 +71,11 @@ private Request.Builder _getHeaders() {
7471 * @return A random URL-safe string between 43-128 characters
7572 */
7673 private String generateCodeVerifier () {
74+ final int CODE_VERIFIER_LENGTH = 96 ;
7775 final String charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" ;
7876 SecureRandom random = new SecureRandom ();
7977 StringBuilder verifier = new StringBuilder ();
80- for (int i = 0 ; i < 128 ; i ++) {
78+ for (int i = 0 ; i < CODE_VERIFIER_LENGTH ; i ++) {
8179 verifier .append (charset .charAt (random .nextInt (charset .length ())));
8280 }
8381 return verifier .toString ();
@@ -103,14 +101,6 @@ private String generateCodeChallenge(String verifier) {
103101 }
104102 }
105103
106- /**
107- * Generates PKCE parameters (code verifier and challenge)
108- */
109- private void generatePkceParameters () {
110- this .codeVerifier = generateCodeVerifier ();
111- this .codeChallenge = generateCodeChallenge (this .codeVerifier );
112-
113- }
114104
115105 /**
116106 * Starts the OAuth authorization flow
@@ -124,6 +114,11 @@ public String authorize() {
124114 urlBuilder .append ("?response_type=" ).append (config .getResponseType ())
125115 .append ("&client_id=" ).append (URLEncoder .encode (config .getClientId (), "UTF-8" ))
126116 .append ("&redirect_uri=" ).append (URLEncoder .encode (config .getRedirectUri (), "UTF-8" ));
117+
118+ // Add scope if provided
119+ if (config .getScope () != null && !config .getScope ().trim ().isEmpty ()) {
120+ urlBuilder .append ("&scope=" ).append (URLEncoder .encode (config .getScope (), "UTF-8" ));
121+ }
127122
128123 if (config .getClientSecret () != null && !config .getClientSecret ().trim ().isEmpty ()) {
129124 return urlBuilder .toString ();
@@ -179,17 +174,6 @@ public CompletableFuture<OAuthTokens> exchangeCodeForToken(String code) {
179174 */
180175 private void _saveTokens (OAuthTokens tokens ) {
181176 this .tokens = tokens ;
182- // Update the client's auth state
183- if (tokens != null && tokens .hasAccessToken ()) {
184- this .httpClient = this .httpClient .newBuilder ()
185- .addInterceptor (chain -> {
186- Request request = chain .request ().newBuilder ()
187- .header ("Authorization" , "Bearer " + tokens .getAccessToken ())
188- .build ();
189- return chain .proceed (request );
190- })
191- .build ();
192- }
193177 }
194178
195179 /**
@@ -248,7 +232,14 @@ private OAuthTokens executeTokenRequest(Request request) throws IOException {
248232 if (!response .isSuccessful ()) {
249233 String error = responseBody != null ? responseBody .string () : "Unknown error" ;
250234 System .err .println ("Error Response Body: " + error );
251- throw new RuntimeException ("Token request failed with status " + response .code () + ": " + error );
235+
236+ // Parse error response if possible
237+ try {
238+ throw new RuntimeException ("Token request failed: " + error );
239+ } catch (JsonParseException e ) {
240+ throw new RuntimeException ("Token request failed with status " +
241+ response .code () + ": " + error );
242+ }
252243 }
253244
254245 String body = responseBody != null ? responseBody .string () : "{}" ;
0 commit comments