2017-09-02 3 views
0

Ich versuche OAuth 2 Authentifizierung für die Meetup API mit Retrofit zu implementieren. Ich habe den Autorisierungscode, aber ich habe Probleme, den Access Token zu bekommen. Hier alle relevanten Bits des Codes:Trouble Meetup APIs Access Token mit Retrofit - Android

Meine onResume Methode:

override fun onResume() { 
    super.onResume() 

    // the intent filter defined in AndroidManifest will handle the return from ACTION_VIEW intent 
    val uri = intent.data 
    if (uri != null && uri.toString().startsWith(CALL_BACK)) { 
     val code = uri.getQueryParameter("code") 
     if (code != null) { 
      // get access token 
      // we'll do that in a minute 
      //"authorize code: $code".show(this) 
      Log.i("Rakshak","Code: $code") // The Authorization Code is printed 

      val loginService = ServiceGenerator.createService(LoginService::class.java) 
      //var request = RequestBody(CLIENT_ID,CLIENT_SECRET,"authorization_code",CALL_BACK,code) 
      val requestBody = "client_id=$CLIENT_ID"+ 
           "&client_secret=$CLIENT_SECRET"+ 
           "&grant_type=authorization_code"+ 
           "&redirect_uri=$CALL_BACK+" + 
           "&code=$code" 

      val call = loginService.getAccessToken(requestBody) 
      //val accessToken = call.execute().body() 

      call.enqueue(object : retrofit2.Callback<AccessToken>{ 
       override fun onResponse(call: Call<AccessToken>?, response: Response<AccessToken>?) { 
        Log.i("Rakshak","Response: ${response.toString()}") // Prints: "Response{protocol=h2, code=400, message=, url=https://secure.meetup.com/oauth2/access}" 
        Log.i("Rakshak","Access token: ${response?.body()?.accessToken}")// Prints: "Access token: null" 
       } 

       override fun onFailure(call: Call<AccessToken>?, t: Throwable?) { 
        Log.i("Rakshak","Didn't work. ${t?.localizedMessage}") 

       } 

      }) 

     } else if (uri.getQueryParameter("error") != null) { 
      // show an error message here 
      "Didn't work. Code: $code".show(this) 
     } 
    } 
} 

Login Service-Schnittstelle:

interface LoginService { 
@FormUrlEncoded 
@POST("https://secure.meetup.com/oauth2/access") 
fun getAccessToken(@Field("body") requestBody: String): Call<AccessToken> 

}

RequestBody Klasse:

data class RequestBody(
    var client_id:String, 
    var client_secret: String, 
    var grant_type: String, 
    var redirect_uri: String, 
    var code: String) 

Relevant Methoden aus der Klasse Service-Generator:

private val API_BASE_URL = "https://secure.meetup.com/oauth2/access/" 

private val httpClient = OkHttpClient.Builder() 

private val builder = Retrofit.Builder() 
     .baseUrl(API_BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 

private var retrofit = builder.build() 

fun <S> createService(serviceClass: Class<S>): S { 
    return retrofit.create(serviceClass); 
} 

die Antwort auf die Zugriffstoken POST geben Sie mir eine Antwort 400 anstatt eines JSON mit einem Zugriffstoken Warum wie es here desribes? Was vermisse ich ?

Antwort

0

Die @Body Annotation bedeutet, dass sie den registrierten Converter verwendet, um den Body zu serialisieren, sodass er nicht wie in der Dokumentation beschrieben gesendet wird, sondern als ein über GSON codiertes JSON-Objekt.

Sie müssen die "form-codierte" Methode verwenden, um die Daten zu senden, suchen Sie nach dem "Formular codierten und mehrteiligen" Abschnitt der Retrofit-Dokumentation.

+0

Danke für Ihre Antwort! Stellt die Meetup-Support-Abfragezeichenfolgenparameter aus. Also habe ich meine Login-Schnittstelle zu getAccessToken (@Query ("client_id") clientId: String, @Query ("client_secret") clientSecret: String, @Query ("grant_type") grantType: String, @Query ("redirect_uri") Umleitung: String, @Query ("Code") Code: String): Call und es hat funktioniert! : D – DrkStr