Open MaxWvM opened 3 years ago
Hello, good afternoon. I downloaded the application, and the same thing happened to me. I found out that etoro added a new header from an x-csrf-token call, which is currently not being sent. modify these 3 files and now it works correctly.
Another thing I had to change is the version of the chrome driver, for a more current one
Maybe I can help you. Greetings
RequestUtils.kt package ok.work.etoroapi.client
import ok.work.etoroapi.client.browser.EtoroMetadata import ok.work.etoroapi.model.TradingMode import okhttp3.Request import java.net.URI import java.net.http.HttpRequest import kotlin.math.round import java.time.LocalDateTime import java.time.format.DateTimeFormatter
fun prepareRequest(path: String, auth: String, mode: TradingMode, credentials: EtoroMetadata): HttpRequest.Builder {
val now = LocalDateTime.now()
val formatter = DateTimeFormatter.ISO_DATE_TIME
val formatted = now.format(formatter)
val dt = formatted.split(".")[0]
println("prepareRequest Current Date and Time: $dt")
return HttpRequest.newBuilder().uri(URI("${credentials.baseUrl}/${path}"))
.header("authority", credentials.domain)
.header("accounttype", mode.name)
.header("x-sts-appdomain", credentials.baseUrl)
.header("content-type", "application/json;charset=UTF-8")
.header("accept", "application/json, text/plain, */*")
.header("x-sts-gatewayappid", "90631448-9A01-4860-9FA5-B4EBCDE5EA1D")
.header("applicationidentifier", "ReToro")
.header("applicationversion", "326.0.3")
.header("origin", credentials.baseUrl)
.header("sec-fetch-site", "same-origin")
.header("sec-fetch-mode", "cors")
.header("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")
.header("authorization", auth)
.header("referer", "${credentials.baseUrl}/login")
.header("cookie", credentials.cookies)
.header("sec-fetch-dest", "empty")
.header("x-csrf-token", "$credentials.cToken")
.header("x-sts-clienttime", "$dt")
}
fun prepareOkRequest(path: String, auth: String, mode: TradingMode, credentials: EtoroMetadata): Request.Builder {
val now = LocalDateTime.now()
val formatter = DateTimeFormatter.ISO_DATE_TIME
val formatted = now.format(formatter)
val dt = formatted.split(".")[0]
println("prepareRequest Current Date and Time: $dt")
return Request.Builder().url("${credentials.baseUrl}/${path}")
.header("authority", credentials.domain)
.header("accounttype", mode.name)
.header("x-sts-appdomain", credentials.baseUrl)
.header("content-type", "application/json;charset=UTF-8")
.header("accept", "application/json, text/plain, */*")
.header("x-sts-gatewayappid", "90631448-9A01-4860-9FA5-B4EBCDE5EA1D")
.header("applicationidentifier", "ReToro")
.header("applicationversion", "326.0.3")
.header("origin", credentials.baseUrl)
.header("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")
.header("sec-fetch-site", "same-origin")
.header("sec-fetch-mode", "cors")
.header("authorization", auth)
.header("referer", "${credentials.baseUrl}/login")
.header("cookie", credentials.cookies)
.header("sec-fetch-dest", "empty")
.header("x-csrf-token", "$credentials.cToken")
.header("x-sts-clienttime", "$dt")
}
fun Double.round(decimals: Int): Double { var multiplier = 1.0 repeat(decimals) { multiplier = 10 } return round(this multiplier) / multiplier }
EtoroBrowserContext.kt package ok.work.etoroapi.client.browser
import org.openqa.selenium.chrome.ChromeDriver import org.openqa.selenium.chrome.ChromeOptions import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component import java.lang.RuntimeException import java.util.* import javax.annotation.PostConstruct
data class EtoroMetadata(val cookies: String, val token: String, val cToken: String, val lsPassword: String, val baseUrl: String, val domain: String)
@Component class EtoroMetadataService(@Value("\${etoro.baseUrl}") val baseUrl: String, @Value("\${etoro.domain}") val domain: String) {
private lateinit var cookies: String
private lateinit var token: String
private lateinit var cToken: String
private lateinit var expirationTime: Date
private lateinit var driver: ChromeDriver
private lateinit var opts: ChromeOptions
@PostConstruct
fun init() {
val pathToDriver: String = when {
System.getProperty("os.name").startsWith("Mac") -> {
"drivers/mac/chromedriver"
}
System.getProperty("os.name").toLowerCase().contains("windows") -> {
"drivers/windows/chromedriver.exe"
}
else -> {
"drivers/ubuntu/chromedriver"
}
}
opts = ChromeOptions()
System.setProperty("webdriver.chrome.driver", pathToDriver)
opts.addArguments("start-maximized")
opts.addArguments("--disable-blink-features=AutomationControlled")
login()
}
fun login() {
driver = ChromeDriver(opts)
driver.get("$baseUrl/login")
val email = System.getenv("LOGIN")
val password = System.getenv("PASSWORD")
if (email == null || password == null) {
throw RuntimeException("LOGIN and/or PASSWORD environment variables are missing")
}
driver.findElementById("username").sendKeys(email)
driver.findElementById("password").sendKeys(password)
driver.findElementByClassName("blue-btn").click()
var seconds = 0
while (true) {
try {
token = driver.executeScript("return JSON.parse(atob(window.localStorage.loginData)).stsData_app_1.accessToken;") as String
println("Token retrieved after %d seconds".format(seconds))
break
} catch (e: Exception) {
if (seconds > 5) {
throw RuntimeException("Failed to retrieve token")
}
Thread.sleep(1000)
seconds++
}
cToken = driver.executeScript("return window.localStorage.cToken") as String
}
expirationTime = Date(driver.executeScript("return JSON.parse(atob(window.localStorage.loginData)).stsData_app_1.expirationUnixTimeMs;") as Long)
println(token)
println("expires at: $expirationTime")
val cookiesSet = driver.manage().cookies
cookies = cookiesSet.toList().joinToString("; ") { cookie -> "${cookie.name}=${cookie.value}" }
println("cookies: $cookies")
println("cToken: $cToken")
driver.quit()
}
fun getMetadata(): EtoroMetadata {
if (Date().after(expirationTime)) {
login()
}
return EtoroMetadata(
cookies,
token,
cToken,
"""{"UserAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36","ApplicationVersion":"213.0.2","ApplicationName":"ReToro","AccountType":"Demo","ApplicationIdentifier":"ReToro"}""",
baseUrl,
domain
)
}
}
hi, appreciate your help but, it didn't work for me
I´ve debugged this error and found that this request: https://www.etoro.com/sapi/trade-real/instruments/private/index?client_request_id=SOME_RANDOM_CLIENT_ID
returns: "error code: 1020 which causes"
After a quick google search I found out that this is from cloudflare: What is a 1020 Error on Cloudflare? Cloudflare Error 1020: Access Denied indicates that you've violated a firewall rule and your connection request has been blocked.
Does someone have any ideas how to bypass this?
Hey, check this one here: https://github.com/ok24601/etoro-api/issues/44
I assume: The user-agend is used to generate the tokens and If you use differend user-agend header in the inital login request, compared to the user-agend used in the kotlin code, cloudflare blocks your requests.
So always try to keep the user-agend and in kotlin equal to your installed chrome. We currently have issues again. I will update sync all values again and will post the update.
Hey, small update...so we sync the agent used in the kotlin code with our browser one and it works fine again. So 100% related to the user-agent. So always keep it in sync OR disable auto update in your chrome browser.
Hey @Loki919, thanks for your reply, it worked.
Hey, small update...so we sync the agent used in the kotlin code with our browser one and it works fine again. So 100% related to the user-agent. So always keep it in sync OR disable auto update in your chrome browser.
Hey, nice work, but how would you approach this when running inside Docker?
Hey guys, i was using the same build i modify the user agent which is 91 as i have chrome 91 and driver is also 91. Can anyone tell me why this is not working ? please see the attached error: JAVA 11 SDK Chrome V91
2021-06-27 02:35:53.581 WARN 2228 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'browserHttpClient': Unsatisfied dependency expressed through field 'userContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userContext': Invocation of init method failed; nested exception is kotlin.UninitializedPropertyAccessException: lateinit property userContext has not been initialized 2021-06-27 02:35:53.605 INFO 2228 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2021-06-27 02:35:53.665 INFO 2228 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-06-27 02:35:53.683 ERROR 2228 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'browserHttpClient': Unsatisfied dependency expressed through field 'userContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userContext': Invocation of init method failed; nested exception is kotlin.UninitializedPropertyAccessException: lateinit property userContext has not been initialized at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.4.RELEASE.jar!/:2.2.4.RELEASE] at ok.work.etoroapi.EtoroApiApplicationKt.main(EtoroApiApplication.kt:54) ~[classes!/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[etoro-api-0.1.4.jar:na] at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[etoro-api-0.1.4.jar:na] at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[etoro-api-0.1.4.jar:na] at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[etoro-api-0.1.4.jar:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userContext': Invocation of init method failed; nested exception is kotlin.UninitializedPropertyAccessException: lateinit property userContext has not been initialized at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1788) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] ... 27 common frames omitted Caused by: kotlin.UninitializedPropertyAccessException: lateinit property userContext has not been initialized at ok.work.etoroapi.client.browser.BrowserHttpClient.getUserContext(BrowserHttpClient.kt:15) ~[classes!/:na] at ok.work.etoroapi.client.browser.BrowserHttpClient.fetchAccountData(BrowserHttpClient.kt:21) ~[classes!/:na] at ok.work.etoroapi.client.UserContext.setupAuthorizationContext(UserContext.kt:40) ~[classes!/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE] ... 39 common frames omitted
@Loki919 @ok24601 @claudio0603 is this build is working with v91 ? I need your help.
yeah any official updates on this or does anyone have a fork I can clone? :)
I tried alot but this built is not working anymore for Chrome V91, Even not for older version. And no one help here :( Anyway iam trying by myself to fixed it, but it would take too much time, as iam new learner of this programming language.
by using swagger most of the calls are not working, Error Code : 1020 occur, even i put the user-agent too but still not working. Is there anyone who will check and let us know is it working with Chrome V91?
We are currently working wih chromeV91. It works totaly fine. There seem to be some problems if you are logged in with any other browser on the same machine. My mate used firefox to login and chrome + chrome driver for the api. this also seem to be nasty. I assume cloudflare uses some machine id and the user-agent for the token. Having 2 session with different browsers makes it complicated.
@Loki919 If you don't mind will you please share the new build which works with V91. I tried it but it not works. I also changes the user agent in code from , but nothing happened. Here are the some changes i made it but it not works.
1st Changed : \"sec-ch-ua\": \"\\" Not A;Brand\\";v=\\"99\\", \\"Chromium\\";v=\\"91\\", \\"Google Chrome\\";v=\\"91\\"\",\n" +
2nd Changed : """{"user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36","ApplicationVersion":"326.0.3","ApplicationName":"ReToro","AccountType":"Demo","ApplicationIdentifier":"ReToro"}""",
Hi guys, Sorry for not responding so long. The error you got is because of Cloud flare protection. The only way to fix it for good is to make all REST calls using selenium drevier.executeScript. Example is here: https://github.com/ok24601/etoro-api/blob/master/src/main/kotlin/ok/work/etoroapi/client/browser/BrowserHttpClient.kt
You will probably be fine to just log in as normal but steal those extra cookies from the browser (ie the CF ones)
Sent from my Galaxy
-------- Original message -------- From: ok24601 @.> Date: 03/07/2021 9:01 am (GMT+00:00) To: ok24601/etoro-api @.> Cc: WarlaxZ @.>, Comment @.> Subject: Re: [ok24601/etoro-api] org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1] (#46)
Hi guys, Sorry for not responding so long. The error you got is because of Cloud flare protection. The only way to fix it for good is to make all REST calls using selenium drevier.executeScript. Example is here: https://github.com/ok24601/etoro-api/blob/master/src/main/kotlin/ok/work/etoroapi/client/browser/BrowserHttpClient.kt
— You are receiving this because you commented. Reply to this email directly, view it on GitHubhttps://github.com/ok24601/etoro-api/issues/46#issuecomment-873366079, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADO6YE526V3KK6C6GQ2MALDTV27VRANCNFSM45ASMYDQ.
i'm using all cookies after login already
Hi guys, Sorry for not responding so long. The error you got is because of Cloud flare protection. The only way to fix it for good is to make all REST calls using selenium drevier.executeScript. Example is here: https://github.com/ok24601/etoro-api/blob/master/src/main/kotlin/ok/work/etoroapi/client/browser/BrowserHttpClient.kt
Yes iam already did it with this. Thanks for the reply.. I already set lot of calls in working condition. Only Update Position is remaining. But sometime it gives an error due to injecting execute script in browser. Anyways but its working by using Selenium Execute Function.
org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
@WarlaxZ is it working for you same build without using selenium drevier.executeScript ? by using normal api calls with authorization token ? By the way it works only first 2 calls and than iam unable to do it. I don't know what happened. I tried alot but i found 1020 error. no matter what iam login with some other browser or not. But it gives an errror for most of the calls 1020 like getCash, getAssetInfo
@ok24601 so you are planning to rewrite the API calls using executeScript? @mzeeshanilyas do you mind to share your work in pull request?
when trying to start the API today i was greeted by this line.. I tried updating the project files from 1.1.3 to 1.1.4, but allas this did not fix my problem. might anyone know how to fix this?
full output in attatched file, but this is the 'caused by' list
error log.docx
Caused by: org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1] at org.json.JSONTokener.syntaxError(JSONTokener.java:505) ~[json-20180813.jar!/:na] at org.json.JSONObject.(JSONObject.java:215) ~[json-20180813.jar!/:na]
at org.json.JSONObject.(JSONObject.java:399) ~[json-20180813.jar!/:na]
at ok.work.etoroapi.client.UserContext.getAccountData(UserContext.kt:45) ~[classes!/:na]
at ok.work.etoroapi.client.UserContext.setupAuthorizationContext(UserContext.kt:36) ~[classes!/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
... 39 common frames omitted