2017-10-16 8 views
0

私はuber sdkをリクエストスコープ(制限付き)で設定しています。 LoginManagerコールバックメソッドonAuthorizationCodeReceived()では、onLoginSuccess()コールバックメソッドが呼び出されていないのに対して、私はパラメータとしてauthorizationCodeを取得しています。ログインコールバックで認証コードを使用してUBERアクセストークンを取得する方法

ここ

私のコードがある...

config = initialiseUberSDK(); 
accessTokenManager = new AccessTokenManager(this); 
loginManager = new LoginManager(accessTokenManager, 
    new LoginCallback() { 

     @Override 
     public void onLoginCancel() { 
      Toast.makeText(CustomActivity2.this, "Login cancelled", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onLoginError(@NonNull AuthenticationError error) { 
      Toast.makeText(CustomActivity2.this, 
           "Error: "+error.name(), Toast.LENGTH_LONG) 
           .show(); 
     } 

     @Override 
     public void onLoginSuccess(@NonNull AccessToken accessToken) { 
      Toast.makeText(CustomActivity2.this, "Login success", 
           Toast.LENGTH_LONG) 
           .show(); 
         createSession(); 
     } 

     @Override 
     public void onAuthorizationCodeReceived(@NonNull String authorizationCode) { 
      Toast.makeText(CustomActivity2.this, "Your Auth code is: "+authorizationCode, 
           Toast.LENGTH_LONG) 
           .show(); 
      } 
     }, 
     config, 
     1113).setRedirectForAuthorizationCode(true); 
    customButton = (Button) findViewById(R.id.button); 
    customButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     loginManager.login(CustomActivity2.this); 
    } 
}); 

をそしてここでinitialiseUberSDK()メソッドがある...ここで

private SessionConfiguration initialiseUberSDK() { 
     config = new SessionConfiguration.Builder() 
       .setClientId(getResources().getString(R.string.client_id)) 
//    .setServerToken(getResources().getString(R.string.server_token)) 
//    .setClientSecret(getResources().getString(R.string.client_secret)) 
       .setRedirectUri(getResources().getString(R.string.redirect_url)) 
       .setEnvironment(SessionConfiguration.Environment.SANDBOX) 
       .setScopes(Arrays.asList(Scope.PROFILE, Scope.RIDE_WIDGETS, Scope.REQUEST)) 
       .build(); 
//  UberSdk.initialize(config); 
     return config; 
    } 

onLoginSuccess()メソッドは呼び出されませんされています。 onAuthorizationCodeReceived()メソッドのみが呼び出されます(アクセストークンオブジェクトがnullの場合)。

私の質問には、認証コードを使用してアクセストークンを生成する方法を

のですか?以下は

(@NonNull文字列 authorizationCode)onAuthorizationCodeReceived onAuthorizationCodeReceived()メソッド...

*

ます。public voidのJavaのドキュメントであるインターフェースからコピーされ

説明: LoginCallback認証コードがリダイレクトURIに返されたときに呼び出されます。 パラメータインタフェースLoginCallbackにonAuthorizationCodeReceived :AccessToken は、 https://developer.uber.com/docs/authentication#section-step-two-receive-redirect がで指定された参照クライアントシークレットを使用して取得する必要があります authorizationCode - AccessTokenを取得するために使用することができますauthorizationCode

*

答えて

0

ますSO questionも掲載しました。あなたが提出したこのサンプルに基づいて承認コードを使用してください。あなたが応答として有効なアクセストークン(KA.eyJ2ZXJzaW9uIjoyLCJ *****)を取得できたことがログから確認されているためです。また、新しい乗車要求を正常に開始します。したがって、これを達成するために使用したコードは有効なコードです。
これで問題が解決しない場合は、Android SDK sampleをご確認ください。

0

はい、権限コードを使用してアクセストークンを取得できます。私はあなたのREST Webサービスのドキュメントを見て、有効な認証コードでサーバーにPOSTリクエストを使用して、アクセストークンを生成するために必要なパラメータを取得できることを発見しました。ここで

は、APIに問題がサーバに要求の言及がないです

loginManager = new LoginManager(accessTokenManager, 
       new LoginCallback() { 

        @Override 
        public void onLoginCancel() { 
         Toast.makeText(CustomActivity2.this, "Login cancelled", Toast.LENGTH_LONG).show(); 
        } 

        @Override 
        public void onLoginError(@NonNull AuthenticationError error) { 
         Toast.makeText(CustomActivity2.this, 
           "Error: "+error.name(), Toast.LENGTH_LONG) 
           .show(); 
        } 

        @Override 
        public void onLoginSuccess(@NonNull AccessToken accessToken) { 
         Toast.makeText(CustomActivity2.this, "Login success", 
           Toast.LENGTH_LONG) 
           .show(); 
        } 

        @Override 
        public void onAuthorizationCodeReceived(@NonNull String authorizationCode) { 
         Toast.makeText(CustomActivity2.this, "Your Auth code is: "+authorizationCode, 
           Toast.LENGTH_LONG) 
           .show(); 
         Ion.with(getApplicationContext()) 
           .load("POST", "https://login.uber.com/oauth/v2/token") 
           .setBodyParameter("client_id",getResources().getString(R.string.client_id)) 
           .setBodyParameter("client_secret",getResources().getString(R.string.client_secret)) 
           .setBodyParameter("grant_type","authorization_code") 
           .setBodyParameter("redirect_uri",getResources().getString(R.string.redirect_url)) 
           .setBodyParameter("code",authorizationCode) 
           .setBodyParameter("scope","profile history request") 
           .asString() 
           .setCallback(new FutureCallback<String>() { 
            @Override 
            public void onCompleted(Exception e, String result) { 
             try { 
              JSONObject jsonObject = new JSONObject(result); 
              if (result.contains("error")) { 
               String error = jsonObject.getString("error"); 
               Toast.makeText(CustomActivity2.this, error, Toast.LENGTH_SHORT).show(); 
              }else { 
               String accessTokenTemp = jsonObject.getString("access_token"); 
               String expiresInTemp = jsonObject.getString("expires_in"); 
               String lastAuthenticatedTemp = jsonObject.getString("last_authenticated"); 
               String refreshTokenTemp = jsonObject.getString("refresh_token"); 
               String scopeTemp = jsonObject.getString("scope"); 
               String tokenTypeTemp = jsonObject.getString("token_type"); 

               AccessTokenManager accessTokenManager = new AccessTokenManager(getApplicationContext()); 
               int expirationTime = Integer.parseInt(expiresInTemp); 
               List<Scope> scopes = Arrays.asList(Scope.PROFILE, Scope.HISTORY, Scope.REQUEST); 
               String token = accessTokenTemp; 
               String refreshToken = refreshTokenTemp; 
               String tokenType = tokenTypeTemp; 
               AccessToken accessToken = new AccessToken(expirationTime, scopes, token, refreshToken, tokenType); 
               accessTokenManager.setAccessToken(accessToken); 

               if (accessTokenManager.getAccessToken() != null){ 
                createSession(); 
               } 
              } 
             } catch (JSONException e1) { 
              e1.printStackTrace(); 
             } 
            } 
           }); 
        } 
       }, 
       config, 
       1113).setRedirectForAuthorizationCode(true); 

...アクセストークンを生成するために、HTTP POSTメソッドを使用してコールバックとリクエストサーバに認証コードを取得するための私の更新されたコードですアクセストークンを取得するためのPOSTメソッド。また、doc内のonAuthorizationCodeReceived()コールバックメソッドの記述はありません。

また、他のすべてがそうしているように、この操作を行うためのJAVAインターフェイスが必要です(少なくとも、ドキュメントにはプロセスを記述する必要があります)。

私は解決策を投稿していますが、私は自分自身(14時間自我)で解決策を見つけました。希望、これは誰かを助けるでしょう。

注:私はネットワーククライアントとしてIONライブラリを使用しました。

関連する問題