androidappauth

AppAuth not closing browser in Android


I am trying to get the access from singpass(https://www.singpass.gov.sg/main). I am using the following code.

private fun configAndStartActivity(){

        val jsonConfig = "{" +
                "\"issuer\":\"https://test.api.myinfo.gov.sg\"," +
                "\"authorizationEndpoint\":\"https://test.api.myinfo.gov.sg/com/v3/authorise\"," +
                "\"tokenEndpoint\":\"https://test.api.myinfo.gov.sg/com/v3/token\"" +
                "}"

        val serviceConfig = AuthorizationServiceConfiguration.fromJson(jsonConfig)

        val clientId = "MY_CLIENT_ID"
        val redirectUri = Uri.parse("https://our_redirectURL/testpath")
        val builder = AuthorizationRequest.Builder(
            serviceConfig,
            clientId,
            ResponseTypeValues.CODE,
            redirectUri
        )
        builder.setScope("openid")
        val additionalParams = mutableMapOf<String, String>()
        additionalParams["purpose"] = "resetting Login Password."
        additionalParams["attributes"] = "uinfin,name,hanyupinyinname,aliasname,hanyupinyinaliasname,marriedname,dob"
        additionalParams["redirect_uri_https_type"] = "app_claimed_https"
        builder.setAdditionalParameters(additionalParams)
        builder.setState("STATE_ID")
        val authRequest = builder.build()
        val authService = AuthorizationService(this)
        val authIntent = authService.getAuthorizationRequestIntent(authRequest)
        startActivityForResult(authIntent, 100)
    }


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == RC_AUTH) {
            val resp = AuthorizationResponse.fromIntent(data!!)
            val ex = AuthorizationException.fromIntent(data)

            if (resp != null) {
                mAuthService = AuthorizationService(this)
                mStateManager?.updateAfterAuthorization(resp, ex)

                mAuthService?.performTokenRequest(
                    resp.createTokenExchangeRequest()
                ) { resp, ex ->
                    if (resp != null) {

                        mStateManager?.updateAfterTokenResponse(resp, ex)
                        Log.d("accessToken", resp.accessToken)
                    } else {
                        // authorization failed, check ex for more details
                    }
                }
            } 
        }
    }

My manifest:

            <activity
                android:name="net.openid.appauth.RedirectUriReceiverActivity"
                tools:node="replace"
            android:exported="true">

            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="https"
                    android:host="our_redirectURL"
                    android:path="/testpath/"/>
            </intent-filter>

            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="https"
                    android:host="our_redirectURL"
                    android:path="/testpathnew"/>
            </intent-filter>
        </activity>

After call configAndStartActivity() method browser is opened. And able to do login process. After that I need to close the browser and come back to my app with authcode. Same code I used for google authentication is working fine. But When I try to singpass browser is not closed. Please help me on this. I am using this link for reference. In the bottom of that link we can see the video demo. I need the same in my app. Upto agree page is going and than redirect to our site url. But not closing the browser and not return back to our app.

I verified the final URL using chrome://inspect/#devices. I am getting the following url.

https://our_redirectURL/testpath/#/prelogin/99/DEEPLINK/FRGTPWD?code=xxxxxcd9805715xxxxx5387f5e5xxxxx9e6be4_ndiState_xxxxx356924xxxxx13


Solution

  • Finally found the route cause. Need to use custom scheme. The https scheme is common. If we use custom Scheme app will understand the redirecting comments. So I used custom scheme. I used com.ourapp://our_redirectURL/testpath as a redirect url. In manifest I used the following code.

    <intent-filter android:autoVerify="true">
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="android.intent.category.BROWSABLE"/>
                    <data android:scheme="com.ourapp"
                        android:host="our_redirectURL"/>
                </intent-filter>
    

    Now working fine.!!