diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt index 2d9e396..9ac5889 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/HomeFragment.kt @@ -4,7 +4,6 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.net.ConnectivityManager import android.nfc.NfcAdapter import android.nfc.TagLostException import android.nfc.tech.IsoDep @@ -14,7 +13,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -106,10 +104,28 @@ class HomeFragment : Fragment() { try { if (mobile) { // We use !! to get extras because we want an exception to be thrown when something is missing. - intentParams.setChallenge(requireActivity().intent.getStringExtra("challenge")!!) + //intentParams.setChallenge(requireActivity().intent.getStringExtra("challenge")!!) intentParams.setAuthUrl(requireActivity().intent.getStringExtra("authUrl")!!) intentParams.setOrigin(requireActivity().intent.getStringExtra("originUrl")!!) - goToTheNextFragment(mobile) + val challengeUrl = requireActivity().intent.getStringExtra("challenge")!! + val headers = requireActivity().intent.getStringExtra("headers")!! + val map: HashMap = HashMap() + map.put("sessionId", headers) + intentParams.setHeaders(map) + Ion.getDefault(activity).conscryptMiddleware.enable(false) + Ion.with(activity) + .load(challengeUrl) + .setHeader("sessionId", headers) + .asJsonObject() + .setCallback { _, result -> + try { + val challenge = result.asJsonObject["nonce"].toString().replace("\"", "") + intentParams.setChallenge(challenge) + goToTheNextFragment(mobile) + } catch (e: Exception) { + Log.i("GETrequest", e.toString()) + } + } } else { //Website /* var challenge = requireActivity().intent.data!!.getQueryParameter("challenge")!! diff --git a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt index 59a8837..f2118d0 100644 --- a/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt +++ b/MobileAuthApp/app/src/main/java/com/tarkvaraprojekt/mobileauthapp/ResultFragment.kt @@ -47,17 +47,20 @@ class ResultFragment : Fragment() { /** * Only used when the MobileAuthApp was launched by an app. Not for website use. + * Not really the safest way of doing things, but sufficient for POC purposes. */ private fun createResponse( success: Boolean = true, - result: String = "noResult", - token: String = "noToken" + idCode: String = "noCode", + name: String = "noName", + authority: String = "noAuthority" ) { val responseCode = if (success) AppCompatActivity.RESULT_OK else AppCompatActivity.RESULT_CANCELED val resultIntent = Intent() - resultIntent.putExtra("result", result) - resultIntent.putExtra("token", token) + resultIntent.putExtra("idCode", idCode) + resultIntent.putExtra("name", name) + resultIntent.putExtra("authority", authority) requireActivity().setResult(responseCode, resultIntent) requireActivity().finish() } @@ -81,6 +84,7 @@ class ResultFragment : Fragment() { .setJsonObjectBody(json) .asJsonObject() .setCallback { e, result -> + Log.i("resultTag", result.toString()) if (result == null) { if (args.mobile) { createResponse(false) @@ -89,7 +93,11 @@ class ResultFragment : Fragment() { } } else { if (args.mobile) { - createResponse(true, result.toString(), paramsModel.token) + val userData = result.asJsonObject["userData"] + val idCode = userData.asJsonObject["idCode"].asString + val name = userData.asJsonObject["name"].asString + val authority = result.asJsonObject["roles"].asJsonArray[0].asJsonObject["authority"].asString + createResponse(true, idCode, name, authority) } else { requireActivity().finishAndRemoveTask() } diff --git a/TestMobileApp/app/build.gradle b/TestMobileApp/app/build.gradle index 4645a41..06491a6 100644 --- a/TestMobileApp/app/build.gradle +++ b/TestMobileApp/app/build.gradle @@ -43,4 +43,5 @@ dependencies { testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } \ No newline at end of file diff --git a/TestMobileApp/app/src/main/AndroidManifest.xml b/TestMobileApp/app/src/main/AndroidManifest.xml index 2fe204c..8d63319 100644 --- a/TestMobileApp/app/src/main/AndroidManifest.xml +++ b/TestMobileApp/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + if (response.resultCode == Activity.RESULT_OK) { binding.loginTextView.text = getString(R.string.auth_success) // Logs are used to show what information can be retrieved from the mobileauthapp. - Log.i("getResult", response.data?.getStringExtra("token").toString()) - Log.i("getResult", response.data?.getStringExtra("result").toString()) + Log.i("getResult", response.data?.getStringExtra("idCode").toString()) + Log.i("getResult", response.data?.getStringExtra("name").toString()) + Log.i("getResult", response.data?.getStringExtra("authority").toString()) var user = "" try { - val resultObject = JSONObject(response.data?.getStringExtra("result").toString()) - user = resultObject.getString("principal") + user = response.data?.getStringExtra("name").toString() } catch (e: Exception) { - Log.i("getResult", "unable to retrieve name from principal") + Log.i("getResult", "unable to retrieve name") } showResult(user) } @@ -55,47 +55,27 @@ class MainActivity : AppCompatActivity() { showLogin() - binding.loginOptionNfcButton.setOnClickListener { getData() } + binding.loginOptionNfcButton.setOnClickListener { + launchAuth() + } } /** * Method that creates an intent to launch the MobileAuthApp */ - private fun launchAuth(challenge: String = "challenge", originUrl: String = "baseUrl", authUrl: String = "authUrl") { + private fun launchAuth() { val launchIntent = Intent() launchIntent.setClassName("com.tarkvaraprojekt.mobileauthapp", "com.tarkvaraprojekt.mobileauthapp.MainActivity") launchIntent.putExtra("action", "auth") - launchIntent.putExtra("challenge", challenge) - launchIntent.putExtra("originUrl", originUrl) - launchIntent.putExtra("authUrl", authUrl) + launchIntent.putExtra("challenge", CHALLENGE_URL) + launchIntent.putExtra("originUrl", BASE_URL) + launchIntent.putExtra("authUrl", AUTH_URL) + launchIntent.putExtra("headers","${(0..100000).random()}") launchIntent.putExtra("mobile", true) authLauncher.launch(launchIntent) } - /** - * Method for retrieving data from an endpoint. - * Ion library is used as it is very convenient for making simple GET requests. - */ - private fun getData() { - // Enter the server endpoint address to here - val url = "$BASE_URL/auth/challenge" - Ion.getDefault(this).conscryptMiddleware.enable(false) - Ion.with(applicationContext) - .load(url) - .asJsonObject() - .setCallback { _, result -> - try { - // Get data from the result and call launchAuth method - val challenge = result.asJsonObject["nonce"].toString().replace("\"", "") - Log.v("Challenge", challenge) - launchAuth(challenge, BASE_URL, "/auth/authentication") - } catch (e: Exception) { - Log.i("GETrequest", "was unsuccessful") - } - } - } - private fun showLogin() { binding.loginOptions.visibility = View.VISIBLE } diff --git a/TestMobileApp/build.gradle b/TestMobileApp/build.gradle index 59a783a..846d643 100644 --- a/TestMobileApp/build.gradle +++ b/TestMobileApp/build.gradle @@ -1,5 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext.kotlin_version = '1.4.10' repositories { google() mavenCentral() @@ -7,7 +8,7 @@ buildscript { dependencies { classpath "com.android.tools.build:gradle:7.0.2" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20" - + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }