Я использую OkHttp в своем приложении Android, которое запрашивает ответ от Сервера, написанного на Spring Boot, который стоит за Nginx. Backend использует Oauth2, поэтому во время аутентификации мы должны нажать oauth/token
конечную точку с username
password
grant_type
, а также Basic Auth
с именем пользователя и паролем. Если мы нажмем на API на Postman, он даст правильный ответ, но OkHttp вернет 400 Bad Request
.
Это мой код
class BasicAuthInterceptor():Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val credentials = Credentials.basic("username", "password")
val authenticatedResutl = request.newBuilder().header("Authorization",credentials).build()
return chain.proceed(authenticatedResutl)
}
}
@Provides
@Singleton
fun provideOkhttp(
tokenInterceptor: TokenInterceptor,
tokenAutheticator: TokenAutheticator
): OkHttpClient {
val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.BODY)
val basicAuthInterceptor = BasicAuthInterceptor()
val client = OkHttpClient.Builder()
.authenticator(tokenAutheticator)
.addInterceptor(logging)
.addInterceptor(basicAuthInterceptor)
.addInterceptor(tokenInterceptor)
.build()
return client
}
А это лог
D/OkHttp: <-- 400 Bad Request https://myserver.com/api/v1/oauth/token (1434ms)
D/OkHttp: Server: nginx/1.17.8
D/OkHttp: Date: Fri, 14 Feb 2020 12:46:13 GMT
D/OkHttp: Content-Type: text/html
D/OkHttp: Content-Length: 157
D/OkHttp: Connection: close
D/OkHttp: <html>
D/OkHttp: <head><title>400 Bad Request</title></head>
D/OkHttp: <body>
D/OkHttp: <center><h1>400 Bad Request</h1></center>
D/OkHttp: <hr><center>nginx/1.17.8</center>
D/OkHttp: </body>
D/OkHttp: </html>
D/OkHttp: <-- END HTTP (157-byte body)