Как получить токен доступа UBER, используя код авторизации в обратном вызове входа

Я настраиваю uber sdk с областью запроса (с ограничениями). В методе обратного вызова LoginManager onAuthorizationCodeReceived() я получаю код авторизации в качестве параметра, тогда как метод обратного вызова onLoginSuccess() не вызывается.

Вот мой код...

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).

мой вопрос

как сгенерировать токен доступа с помощью кода авторизации?

Ниже приведен java-документ метода onAuthorizationCodeReceived()...

*

public void onAuthorizationCodeReceived(@NonNull String авторизацияCode)

Описание, скопированное из интерфейса: LoginCallback Вызывается, когда код авторизации возвращается в URI перенаправления. AccessToken необходимо получить с помощью Client Secret, см. https://developer.uber.com/docs/authentication#section-step-two-receive-redirect Задается: onAuthorizationCodeReceived в интерфейсе LoginCallback Параметры: authorizationCode — код авторизации, который можно использовать для получения AccessToken.

*


person Sayan Mukherjee    schedule 16.10.2017    source источник


Ответы (2)


Вы также разместили SO вопрос. Пожалуйста, используйте код авторизации в соответствии с этим образцом, который вы отправили, потому что наши журналы подтверждают, что вам удалось получить действительный токен доступа в качестве ответа (KA.eyJ2ZXJzaW9uIjoyLCJ*****). Кроме того, вы успешно инициируете новый запрос на поездку. Таким образом, код, который вы использовали для достижения этого, является допустимым кодом.
Если это не отвечает на ваш вопрос, проверьте Android SDK пример.

person Sasa Jovanovic    schedule 16.10.2017

Да, вы правы, мне удается получить токен доступа с помощью кода авторизации. Я просмотрел ваш документ веб-службы REST и обнаружил, что, используя POST-запрос к серверу с действительным кодом авторизации, я могу получить необходимые параметры для создания токена доступа.

Вот мой обновленный код для получения кода аутентификации на сервере обратного вызова и запроса с использованием метода HTTP POST для создания токена доступа...

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);

Проблема с API заключается в том, что нет упоминания о запросе сервером метода POST для получения токена доступа. Также в документе нет упоминания о методе обратного вызова onAuthorizationCodeReceived().

А также должен быть интерфейс JAVA для выполнения этой операции, как и все остальное (ИЛИ, по крайней мере, в документе они должны упомянуть процесс).

Как бы то ни было, вчера вечером я нашел решение самостоятельно (14 часов эго) и теперь (сегодня утром) выкладываю решение. Надеюсь, это поможет кому-то.

ПРИМЕЧАНИЕ. Я использовал библиотеку ION в качестве сетевого клиента.

person Sayan Mukherjee    schedule 17.10.2017