okta / okta-oidc-android

OIDC SDK for Android
https://github.com/okta/okta-oidc-android
Other
60 stars 45 forks source link

ArrayIndexOutOfBoundsException on Refresh Token #297

Closed yatw closed 2 years ago

yatw commented 2 years ago

Hi I am using SyncWebAuthClient with SyncSessionClient. But when I refresh token, I get the following error, looks like okta internal error with okhttp. Appreciate any help.

Reproduced by leaving the app in the background for a few hours, wait for access token to expire, come back and call refreshToken.

Device: xiaomi redmi 7

12-11 21:06:20.936 31748 31889 W System.err: AuthorizationException: {"type":0,"code":3,"errorDescription":"Network error"}
12-11 21:06:20.936 31748 31889 W System.err:    at com.okta.oidc.net.request.TokenRequest.executeRequest(TokenRequest.java:171)
12-11 21:06:20.936 31748 31889 W System.err:    at com.okta.oidc.clients.sessions.SyncSessionClientImpl.refreshToken(SyncSessionClientImpl.java:190)
12-11 21:06:20.936 31748 31889 W System.err:    at com.example.myproject.global.api.TokenBearer.renewToken(TokenBearer.kt:15)
12-11 21:06:20.936 31748 31889 W System.err:    at com.example.myproject.global.api.TokenBearer.getAccessToken(TokenBearer.kt:21)
12-11 21:06:20.936 31748 31889 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl.getDynamicHeaders(CreditsClientImpl.kt:50)
12-11 21:06:20.936 31748 31889 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl.access$getDynamicHeaders(CreditsClientImpl.kt:15)
12-11 21:06:20.936 31748 31889 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl$missionClient$2$1.invoke(CreditsClientImpl.kt:58)
12-11 21:06:20.937 31748 31889 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl$missionClient$2$1.invoke(CreditsClientImpl.kt:58)
12-11 21:06:20.937 31748 31889 W System.err:    at com.example.myproject.global.api.clients.MissionClient.getPropertyItemsById(MissionClient.kt:42)
12-11 21:06:20.937 31748 31889 W System.err:    at com.example.myproject.features.main.mission.MissionRepository$getPropertyItemsById$2.makeApiCall(MissionRepository.kt:141)
12-11 21:06:20.937 31748 31889 W System.err:    at com.example.myproject.global.network.NetworkBoundResource.fetchFromNetwork(NetworkBoundResource.kt:48)
12-11 21:06:20.937 31748 31889 W System.err:    at com.example.myproject.global.network.NetworkBoundResource.access$fetchFromNetwork(NetworkBoundResource.kt:17)
12-11 21:06:20.937 31748 31889 W System.err:    at com.example.myproject.global.network.NetworkBoundResource$1.invokeSuspend(NetworkBoundResource.kt:34)
12-11 21:06:20.937 31748 31889 W System.err:    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-11 21:06:20.937 31748 31889 W System.err:    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-11 21:06:20.937 31748 31889 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
12-11 21:06:20.937 31748 31889 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
12-11 21:06:20.937 31748 31889 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
12-11 21:06:20.937 31748 31889 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
12-11 21:06:20.937 31748 31889 W System.err: Caused by: java.lang.ArrayIndexOutOfBoundsException: size=2 offset=0 byteCount=38
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.okio.Util.checkOffsetAndCount(Util.java:31)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.okio.Okio$1.write(Okio.java:73)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.okio.RealBufferedSink.writeUtf8(RealBufferedSink.java:59)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.internal.http.Http1xStream.writeRequest(Http1xStream.java:169)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.internal.http.Http1xStream.writeRequestHeaders(Http1xStream.java:125)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:606)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475)
12-11 21:06:20.937 31748 31889 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
12-11 21:06:20.938 31748 31889 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
12-11 21:06:20.938 31748 31889 W System.err:    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:211)
12-11 21:06:20.938 31748 31889 W System.err:    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:30)
12-11 21:06:20.938 31748 31889 W System.err:    at com.okta.oidc.net.HttpClientImpl.connect(HttpClientImpl.java:115)
12-11 21:06:20.938 31748 31889 W System.err:    at com.okta.oidc.net.request.BaseRequest.openConnection(BaseRequest.java:58)
12-11 21:06:20.938 31748 31889 W System.err:    at com.okta.oidc.net.request.TokenRequest.executeRequest(TokenRequest.java:130)
12-11 21:06:20.938 31748 31889 W System.err:    ... 18 more
12-11 21:06:20.938 31748 31888 W System.err: AuthorizationException: {"type":0,"code":3,"errorDescription":"Network error"}
12-11 21:06:20.938 31748 31888 W System.err:    at com.okta.oidc.net.request.TokenRequest.executeRequest(TokenRequest.java:171)
12-11 21:06:20.938 31748 31888 W System.err:    at com.okta.oidc.clients.sessions.SyncSessionClientImpl.refreshToken(SyncSessionClientImpl.java:190)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.TokenBearer.renewToken(TokenBearer.kt:15)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.TokenBearer.getAccessToken(TokenBearer.kt:21)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl.getDynamicHeaders(CreditsClientImpl.kt:50)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl.access$getDynamicHeaders(CreditsClientImpl.kt:15)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl$missionClient$2$1.invoke(CreditsClientImpl.kt:58)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl$missionClient$2$1.invoke(CreditsClientImpl.kt:58)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.global.api.clients.MissionClient.getPropertyCategoriesById(MissionClient.kt:26)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.features.main.mission.MissionRepository.initMission(MissionRepository.kt:41)
12-11 21:06:20.939 31748 31888 W System.err:    at com.example.myproject.features.main.mission.MissionViewModel$initMission$1.invokeSuspend(MissionViewModel.kt:131)
12-11 21:06:20.939 31748 31888 W System.err:    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-11 21:06:20.939 31748 31888 W System.err:    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-11 21:06:20.939 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
12-11 21:06:20.939 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
12-11 21:06:20.939 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
12-11 21:06:20.939 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
12-11 21:06:20.939 31748 31888 W System.err: Caused by: java.lang.NullPointerException: Attempt to read from field 'int com.android.okhttp.okio.Segment.limit' on a null object reference
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.okio.Okio$1.write(Okio.java:77)
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.okio.RealBufferedSink.writeUtf8(RealBufferedSink.java:59)
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.internal.http.Http1xStream.writeRequest(Http1xStream.java:169)
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.internal.http.Http1xStream.writeRequestHeaders(Http1xStream.java:125)
12-11 21:06:20.939 31748 31888 W System.err:    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:606)
12-11 21:06:20.940 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475)
12-11 21:06:20.940 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
12-11 21:06:20.940 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
12-11 21:06:20.940 31748 31888 W System.err:    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:211)
12-11 21:06:20.940 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:30)
12-11 21:06:20.940 31748 31888 W System.err:    at com.okta.oidc.net.HttpClientImpl.connect(HttpClientImpl.java:115)
12-11 21:06:20.940 31748 31888 W System.err:    at com.okta.oidc.net.request.BaseRequest.openConnection(BaseRequest.java:58)
12-11 21:06:20.940 31748 31888 W System.err:    at com.okta.oidc.net.request.TokenRequest.executeRequest(TokenRequest.java:130)
12-11 21:06:20.940 31748 31888 W System.err:    ... 16 more
12-11 21:06:20.940 31748 31888 W System.err: AuthorizationException: {"type":0,"code":3,"errorDescription":"Network error"}
12-11 21:06:20.940 31748 31888 W System.err:    at com.okta.oidc.net.request.TokenRequest.executeRequest(TokenRequest.java:171)
12-11 21:06:20.940 31748 31888 W System.err:    at com.okta.oidc.clients.sessions.SyncSessionClientImpl.refreshToken(SyncSessionClientImpl.java:190)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.TokenBearer.renewToken(TokenBearer.kt:15)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.TokenBearer.getAccessToken(TokenBearer.kt:21)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl.getDynamicHeaders(CreditsClientImpl.kt:50)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl.access$getDynamicHeaders(CreditsClientImpl.kt:15)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl$missionClient$2$1.invoke(CreditsClientImpl.kt:58)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.clients.CreditsClientImpl$missionClient$2$1.invoke(CreditsClientImpl.kt:58)
12-11 21:06:20.940 31748 31888 W System.err:    at com.example.myproject.global.api.clients.MissionClient.getPropertyCategoriesById(MissionClient.kt:26)
12-11 21:06:20.941 31748 31888 W System.err:    at com.example.myproject.features.main.mission.MissionRepository.initMission(MissionRepository.kt:41)
12-11 21:06:20.941 31748 31888 W System.err:    at com.example.myproject.features.main.mission.MissionViewModel$initMission$1.invokeSuspend(MissionViewModel.kt:131)
12-11 21:06:20.941 31748 31888 W System.err:    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
12-11 21:06:20.941 31748 31888 W System.err:    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
12-11 21:06:20.941 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
12-11 21:06:20.941 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
12-11 21:06:20.941 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
12-11 21:06:20.941 31748 31888 W System.err:    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
12-11 21:06:20.941 31748 31888 W System.err: Caused by: java.lang.NullPointerException: Attempt to read from field 'int com.android.okhttp.okio.Segment.limit' on a null object reference
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.okio.Okio$1.write(Okio.java:77)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:157)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:177)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.okio.RealBufferedSink.writeUtf8(RealBufferedSink.java:59)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.http.Http1xStream.writeRequest(Http1xStream.java:169)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.http.Http1xStream.writeRequestHeaders(Http1xStream.java:125)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:606)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:475)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:248)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:211)
12-11 21:06:20.941 31748 31888 W System.err:    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:30)
12-11 21:06:20.941 31748 31888 W System.err:    at com.okta.oidc.net.HttpClientImpl.connect(HttpClientImpl.java:115)
12-11 21:06:20.941 31748 31888 W System.err:    at com.okta.oidc.net.request.BaseRequest.openConnection(BaseRequest.java:58)
12-11 21:06:20.941 31748 31888 W System.err:    at com.okta.oidc.net.request.TokenRequest.executeRequest(TokenRequest.java:130)

My usage, getAccessToken() is called.

class TokenBearer(
    private val syncSessionClient: SyncSessionClient
) {

    private var tokens: Tokens = syncSessionClient.tokens

    @WorkerThread
    fun renewToken(){
        tokens = syncSessionClient.refreshToken()
    }

    @WorkerThread
    fun getAccessToken(): String{
        if (tokens.isAccessTokenExpired){
            renewToken()
        }
        return tokens.accessToken?: ""
    }
JayNewstrom commented 2 years ago

Hi @yatw sorry to hear you're running into issues. Can you make sure you're including the latest OkHttp and Okio in your build?

I've seen reports of issues similar to this before. And it looks like there might be a threading issue too. It looks like you have coroutines in your stack trace. Could you tell us more about how you're calling this? Or ideally provide a test case, or buildable/reproducible sample.

yatw commented 2 years ago

Thank you for the response. The project still have the same problem after updating to latest `implementation 'com.okta.android:okta-oidc-android:1.2.1' Unfortunately, I cannot reproduce this problem in another minimal project. I do believe it is some threading issue. I will give more update here if I have more information. Feel free to close this issue for now.