Skip to content

Commit 9ec2d30

Browse files
authored
refactor: make objects internal and move pkce variable out of requests (#32)
* refactor: make objects internal and move pkce variable out of requests * fix: remove logs
1 parent f221900 commit 9ec2d30

File tree

9 files changed

+55
-41
lines changed

9 files changed

+55
-41
lines changed

DauthSDK/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ android {
1818
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1919
consumerProguardFiles "consumer-rules.pro"
2020

21-
buildConfigField("String", "CLIENT_ID", "\"${parsedJson.client_id}\"")
22-
buildConfigField("String", "REDIRECT_URI", "\"${parsedJson.redirect_uri}\"")
23-
buildConfigField("String", "CLIENT_SECRET", "\"${parsedJson.client_secret}\"")
21+
buildConfigField("String", "DAUTH_CLIENT_ID", "\"${parsedJson.client_id}\"")
22+
buildConfigField("String", "DAUTH_REDIRECT_URI", "\"${parsedJson.redirect_uri}\"")
23+
buildConfigField("String", "DAUTH_CLIENT_SECRET", "\"${parsedJson.client_secret}\"")
2424
}
2525

2626
buildTypes {

DauthSDK/src/main/java/edu/nitt/delta/DAuth.kt

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,30 @@ object DAuth {
3434
* clientCreds [ClientCredentials] storing the credentials obtained after client registration in auth.delta.nitt.edu
3535
*/
3636
private var currentUser: User? = null
37-
private var codeVerifier:String? = null
38-
private val clientCreds: ClientCredentials = ClientCredentials(
39-
BuildConfig.CLIENT_ID,
40-
BuildConfig.REDIRECT_URI,
41-
BuildConfig.CLIENT_SECRET
37+
private val clientCredentials: ClientCredentials = ClientCredentials(
38+
BuildConfig.DAUTH_CLIENT_ID,
39+
BuildConfig.DAUTH_REDIRECT_URI,
40+
BuildConfig.DAUTH_CLIENT_SECRET
4241
)
4342

4443
/**
4544
* Wrapper function for sign-in functionality for java consumer
4645
*
4746
* @param activity Activity
4847
* @param authorizationRequest AuthorizationRequest
48+
* @param isPkceEnabled Boolean which tells whether to choose pkce workflow
4949
* @param signInListener ResultListener<Result>
5050
*/
5151
fun signIn(
5252
activity: Activity,
5353
authorizationRequest: AuthorizationRequest,
54+
isPkceEnabled: Boolean,
5455
signInListener: ResultListener<Result>
5556
) {
5657
signIn(
5758
activity,
5859
authorizationRequest,
60+
isPkceEnabled,
5961
onSuccess = { result -> signInListener.onSuccess(result) },
6062
onFailure = { exception -> signInListener.onFailure(exception) }
6163
)
@@ -66,38 +68,38 @@ object DAuth {
6668
*
6769
* @param activity Activity
6870
* @param authorizationRequest AuthorizationRequest
71+
* @param isPkceEnabled Boolean which tells whether to choose pkce workflow
6972
* @param onSuccess Lambda Function that is called on successfull login taking Result as member and returns unit
7073
* @param onFailure Lambda Function that is called on failure taking Exception as member and returns unit
7174
*/
7275
fun signIn(
7376
activity: Activity,
7477
authorizationRequest: AuthorizationRequest,
78+
isPkceEnabled: Boolean,
7579
onSuccess: (Result) -> Unit,
7680
onFailure: (Exception) -> Unit
7781
) {
7882
requestAuthorization(
7983
activity,
8084
authorizationRequest,
85+
isPkceEnabled,
8186
onFailure = { errorState -> onFailure(Exception(errorState.toString())) },
8287
onSuccess = { authorizationResponse ->
8388
if (authorizationResponse.state == authorizationRequest.state) {
8489
fetchToken(
85-
authorizationRequest,
8690
TokenRequest(
87-
client_id = clientCreds.clientId,
88-
client_secret = clientCreds.clientSecret,
8991
grant_type = authorizationRequest.grant_type.toString(),
9092
code = authorizationResponse.authorizationCode,
91-
redirect_uri = clientCreds.redirectUri
93+
code_verifier = authorizationResponse.codeVerifier
9294
),
95+
isPkceEnabled,
9396
onFailure = { e -> onFailure(e) },
9497
onSuccess = { token ->
9598
if (authorizationRequest.scopes.contains(Scope.User)) {
9699
fetchUserDetails(
97100
token.access_token,
98101
onFailure = { e -> onFailure(e) }
99102
) { user ->
100-
currentUser = user
101103
if(authorizationRequest.scopes.contains(Scope.OpenID)){
102104
fetchFromJwt(
103105
authorizationRequest,
@@ -137,16 +139,19 @@ object DAuth {
137139
*
138140
* @param activity Activity
139141
* @param authorizationRequest AuthorizationRequest
142+
* @param isPkceEnabled Boolean which tells whether to choose pkce workflow
140143
* @param authorizationListener ResultListener<AuthorizationResponse>
141144
*/
142145
fun requestAuthorization(
143146
activity: Activity,
144147
authorizationRequest: AuthorizationRequest,
148+
isPkceEnabled: Boolean,
145149
authorizationListener: ResultListener<AuthorizationResponse>
146150
) {
147151
requestAuthorization(
148152
activity,
149153
authorizationRequest,
154+
isPkceEnabled,
150155
onFailure = { authorizationErrorType -> authorizationListener.onFailure(Exception("$authorizationErrorType")) },
151156
onSuccess = { authorizationResponse ->
152157
authorizationListener.onSuccess(
@@ -161,12 +166,14 @@ object DAuth {
161166
*
162167
* @param activity Activity
163168
* @param authorizationRequest AuthorizationRequest
169+
* @param isPkceEnabled Boolean which tells whether to choose pkce workflow
164170
* @param onFailure Lambda function called on failure taking AuthorizationErrorType as member and returns unit
165171
* @param onSuccess Lambda function called on successful authorization taking AuthorizationResponse as member and returns unit
166172
*/
167173
fun requestAuthorization(
168174
activity: Activity,
169175
authorizationRequest: AuthorizationRequest,
176+
isPkceEnabled: Boolean,
170177
onFailure: (AuthorizationErrorType) -> Unit,
171178
onSuccess: (AuthorizationResponse) -> Unit
172179
) {
@@ -183,21 +190,19 @@ object DAuth {
183190
.scheme(Scheme)
184191
.authority(BaseAuthority)
185192
.appendPath("authorize")
186-
.appendQueryParameter("client_id", clientCreds.clientId)
187-
.appendQueryParameter("redirect_uri", clientCreds.redirectUri)
188-
.appendQueryParameter(
189-
"response_type",
190-
authorizationRequest.response_type.toString()
191-
)
193+
.appendQueryParameter("client_id", clientCredentials.clientId)
194+
.appendQueryParameter("redirect_uri", clientCredentials.redirectUri)
195+
.appendQueryParameter("response_type", authorizationRequest.response_type.toString())
192196
.appendQueryParameter("grant_type", authorizationRequest.grant_type.toString())
193197
.appendQueryParameter("state", authorizationRequest.state)
194198
.appendQueryParameter("scope", Scope.combineScopes(authorizationRequest.scopes))
195199
.appendQueryParameter("nonce", authorizationRequest.nonce)
196-
if(authorizationRequest.isPkceEnabled){
200+
var codeVerifier: String? = ""
201+
if(isPkceEnabled){
197202
try {
198203
codeVerifier = pkceUtil.generateCodeVerifier()
199204
uriBuilder.appendQueryParameter("code_challenge",pkceUtil.generateCodeChallenge(
200-
codeVerifier!!,pkceUtil.getCodeChallengeMethod()))
205+
codeVerifier,pkceUtil.getCodeChallengeMethod()))
201206
uriBuilder.appendQueryParameter("code_challenge_method",pkceUtil.getCodeChallengeMethod())
202207
}catch (e: Exception){
203208
onFailure(AuthorizationErrorType.UnableToGenerateCodeVerifier)
@@ -211,13 +216,15 @@ object DAuth {
211216
onFailure = { onFailure(AuthorizationErrorType.ServerDownError) }
212217
) { url ->
213218
val uri: Uri = Uri.parse(url)
214-
if (url.startsWith(clientCreds.redirectUri)) {
219+
if (url.startsWith(clientCredentials.redirectUri)) {
215220
if (uri.query.isNullOrBlank() or uri.query.isNullOrEmpty()) {
216221
onFailure(AuthorizationErrorType.AuthorizationDenied)
217222
} else {
218223
val authorizationResponse = AuthorizationResponse(
219224
uri.getQueryParameter("code") ?: "",
220-
uri.getQueryParameter("state") ?: ""
225+
uri.getQueryParameter("state") ?: "",
226+
codeVerifier ?: "",
227+
isPkceEnabled
221228
)
222229
onSuccess(authorizationResponse)
223230
}
@@ -243,18 +250,18 @@ object DAuth {
243250
/**
244251
* Wrapper function to fetch the auth token for java consumers
245252
*
246-
* @param authorizationRequest AuthorizationRequest
247253
* @param request TokenRequest
254+
* @param isPkceEnabled Boolean which tells whether to choose pkce workflow
248255
* @param fetchTokenListener ResultListener<Token>
249256
*/
250257
fun fetchToken(
251-
authorizationRequest: AuthorizationRequest,
252258
request: TokenRequest,
259+
isPkceEnabled: Boolean,
253260
fetchTokenListener: ResultListener<Token>
254261
) {
255262
fetchToken(
256-
authorizationRequest,
257263
request,
264+
isPkceEnabled,
258265
onFailure = { exception -> fetchTokenListener.onFailure(exception) },
259266
onSuccess = { token -> fetchTokenListener.onSuccess(token) }
260267
)
@@ -263,21 +270,23 @@ object DAuth {
263270
/**
264271
* Fetches the auth token
265272
*
266-
* @param authorizationRequest AuthorizationRequest
267273
* @param request TokenRequest
274+
* @param isPkceEnabled Boolean which tells whether to choose pkce workflow
268275
* @param onFailure Lambda function called on failure taking [Exception] as member and returns unit
269276
* @param onSuccess Lambda function called after fetching token successfully taking [Token] as member and returns unit
270277
*/
271278
fun fetchToken(
272-
authorizationRequest: AuthorizationRequest,
273279
request: TokenRequest,
280+
isPkceEnabled: Boolean,
274281
onFailure: (Exception) -> Unit,
275282
onSuccess: (Token) -> Unit
276283
) {
277284
var requestAsMap :Map<String,String> = request.toMap()
278-
if(authorizationRequest.isPkceEnabled) {
279-
requestAsMap = requestAsMap.plus(Pair("code_verifier", codeVerifier!!))
280-
requestAsMap = requestAsMap.minus("client_secret")
285+
requestAsMap = requestAsMap.plus(Pair("client_id", clientCredentials.clientId))
286+
requestAsMap = requestAsMap.plus(Pair("redirect_uri", clientCredentials.redirectUri))
287+
if(!isPkceEnabled){
288+
requestAsMap = requestAsMap.plus(Pair("client_secret", clientCredentials.clientSecret))
289+
requestAsMap = requestAsMap.minus("code_verifier")
281290
}
282291
RetrofitInstance.api.getToken(requestAsMap).enqueue(object : Callback<Token> {
283292
override fun onResponse(call: Call<Token>, response: Response<Token>) {
@@ -329,7 +338,10 @@ object DAuth {
329338
onFailure(Exception(response.code().toString()))
330339
return
331340
}
332-
response.body()?.let { onSuccess(it) }
341+
response.body()?.let {
342+
currentUser = it
343+
onSuccess(it)
344+
}
333345
}
334346

335347
override fun onFailure(call: Call<User>, t: Throwable) {

DauthSDK/src/main/java/edu/nitt/delta/DauthAccountAuthenticator.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.accounts.AccountManager
77
import android.content.Context
88
import android.content.Intent
99
import android.os.Bundle
10+
import android.util.Log
1011
import edu.nitt.delta.api.RetrofitInstance
1112
import edu.nitt.delta.constants.ErrorCodeConstants
1213
import edu.nitt.delta.constants.ErrorMessageConstants

DauthSDK/src/main/java/edu/nitt/delta/helpers/PkceUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import java.security.MessageDigest
55
import java.security.NoSuchAlgorithmException
66
import java.security.SecureRandom
77

8-
class PkceUtil {
8+
internal class PkceUtil {
99
/**
1010
* encodeSettings [encodeSettings] that stores constraints for encoding to string as int variable
1111
*/

DauthSDK/src/main/java/edu/nitt/delta/models/AuthorizationRequest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@ data class AuthorizationRequest(
55
val grant_type: GrantType,
66
val state: String,
77
val scopes: List<Scope>,
8-
val nonce: String,
9-
val isPkceEnabled: Boolean
8+
val nonce: String
109
)

DauthSDK/src/main/java/edu/nitt/delta/models/AuthorizationResponse.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@ package edu.nitt.delta.models
22

33
data class AuthorizationResponse(
44
val authorizationCode : String,
5-
val state : String
5+
val state : String,
6+
val codeVerifier: String?,
7+
val isPkceEnabled: Boolean
68
)
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package edu.nitt.delta.models
22

33
data class TokenRequest(
4-
val client_id:String,
5-
val client_secret:String,
64
val grant_type:String,
75
val code: String,
8-
val redirect_uri: String
6+
val code_verifier: String?
97
)

sampleApp/src/Java/java/edu/nitt/delta/MainActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public void onClick(View view) {
4343
GrantType.AuthorizationCode,
4444
"1ww12",
4545
scopes,
46-
"ncsasd",
47-
true),
46+
"ncsasd"),
47+
true,
4848
new ResultListener<Result>() {
4949
@Override
5050
public void onSuccess(@NonNull Result result) {

sampleApp/src/Kotlin/java/edu/nitt/delta/MainActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class MainActivity : AppCompatActivity() {
1818
super.onCreate(savedInstanceState)
1919
setContentView(R.layout.activity_main)
2020
val signInButton: DeltaButton = findViewById(R.id.sign_in_button)
21+
2122
signInButton.setOnClickListener {
2223
DAuth.signIn(
2324
activity = this,
@@ -28,6 +29,7 @@ class MainActivity : AppCompatActivity() {
2829
listOf(Scope.OpenID,Scope.Profile,Scope.Email,Scope.User),
2930
"ncsasd"
3031
),
32+
isPkceEnabled = true,
3133
onSuccess = { result: Result ->
3234
println("Success: $result")
3335
},

0 commit comments

Comments
 (0)