Единый вход в систему в приложении для Android с пользовательскими ярлыками - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь получить маркер входа с веб-страницы с помощью пользовательских вкладок.

Как я понимаю, каждый раз, когда открывается ссылка на cutomtabs, запускается намерение, затем я могу настроить фильтр намерений, чтобывернитесь в мое приложение, когда мне нужно.

Приложение запускает страницу входа в систему на пользовательских вкладках, пользователь вводит свой логин / перенаправляет страницу на страницу https://myapp.companyname.fr/redirect?token=qzdioqzj,qzi,dqzid приложение должно быть запущено обратно

Я настроил chrometabs как таковые в своей деятельности:

public class AuthenticationActivity extends BasicActivity {

    private AuthenticationVm authenticationVm;
    private ActivityAuthenticationBinding binding;

    private CustomTabsServiceConnection mConnection;
    private CustomTabsClient mClient;

    private String authToken ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        App.setAfterAuthentication(false);
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_authentication);
        this.setFinishOnTouchOutside(false);
        authenticationVm = new AuthenticationVm(this);
        binding.setVm(authenticationVm);

        if (null != getUriContainedInIntend()) {
            this.authToken = getTokenFromIntent();
        } else {
            launchCustomTabs();

            mConnection = new CustomTabsServiceConnection() {
                @Override
                public void onCustomTabsServiceConnected(ComponentName componentName, CustomTabsClient customTabsClient) {
                    mClient = customTabsClient;
                }

                @Override
                public void onServiceDisconnected(ComponentName componentName) {
                    mClient = null;
                }
            };
            // force to use chrome
            String packageName = "com.android.chrome";
            CustomTabsClient.bindCustomTabsService(this, packageName, mConnection);

        }
    }

    public void launchCustomTabs() {
        String urlToInterrogate = getString(R.string.sso_api_base_url) +
                getString(R.string.sso_api_authorize_endpoint);
        String rerirectUri = getString(R.string.sso_redirect_uri_scheme)
                + "://"
                + getString(R.string.sso_redirect_uri_host)
                + getString(R.string.sso_redirect_uri_path);

        StringBuilder url = new StringBuilder(urlToInterrogate);
        url.append("?client_id=");
        url.append(getString(R.string.sso_api_client_id));
        url.append("&response_type=code");
        url.append("&redirect_uri=");
        url.append(rerirectUri);

        CustomTabsIntent.Builder mBuilder = new CustomTabsIntent.Builder();
        CustomTabsIntent customTabsIntent = mBuilder.build();
        customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        customTabsIntent.launchUrl(this, Uri.parse(url.toString()));
    }

    private Uri getUriContainedInIntend() {
        return getIntent().getData();
    }

    /**
     * Methode interceptant l'intent pour en extraire le token
     * @return token String
     */
    private String getTokenFromIntent() {
        Uri data = getUriContainedInIntend();
        String uri = data.toString();
        return uri.substring( uri.indexOf("#access_token=") + "#access_token=".length(), uri.indexOf("&expires_in="));
    }


    /**
     * Récupère la propriété binding.
     *
     * @return la valeur de binding
     */
    public ActivityAuthenticationBinding getBinding() {
        return binding;
    }
}

в манифесте Я добавил это, чтобы поймать намерение:

    <activity android:name=".ui.AuthenticationActivity"
        android:screenOrientation="sensorLandscape"
        android:launchMode="singleTop"
        android:noHistory="true"
        android:theme="@style/NoTitleDialog">
        <!-- to catch the sso return -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="@string/sso_redirect_uri_host"
                android:path="@string/sso_redirect_uri_path"
                android:scheme="@string/sso_redirect_uri_scheme" />
        </intent-filter>
    </activity>

и в strings.xml у меня есть:

<!-- SSO -->
<string name="sso_redirect_uri_scheme" translatable="false">https</string>
<string name="sso_redirect_uri_host" translatable="false">myapp.companyname.fr</string>
<string name="sso_redirect_uri_path" translatable="false">/redirect</string>
<string name="sso_api_base_url" translatable="false">https://gw.okm.test.com</string>
<string name="sso_api_authorize_endpoint" translatable="false">/v1/oauth2/authorize</string>
<string name="sso_api_token_endpoint" translatable="false">/v1/oauth2/token</string>
<string name="sso_api_client_id" translatable="false">qzd16q5d156qd1qzd1qz61zq5615d1q6d1z</string>
<string name="sso_api_client_secret" translatable="false">qzd1q6d1q56d1q6d1q1qz6d1zd65qz1dz51</string>

Однако после входа в систему пользователь действительно перенаправляется на: https://myapp.companyname.fr/redirect?token=qz561dqz56d1qz5dqzd Но действие не захватывает намерения.

Я что-то не так сделал?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Это потому, что вам нужно использовать это при открытии URL:

CustomTabsClient.bindCustomTabsService(getApplicationContext(), "com.android.chrome", connection);

0 голосов
/ 13 декабря 2018

Попробуйте использовать собственную схему вместо https.

Пример:

<string name="sso_redirect_uri_scheme" translatable="false">myschema</string>

Затем убедитесь, что ваше веб-приложение перенаправляет на myschema: //myapp.companyname.fr/redirect? Token = qzdioqzj, qzi, dqzid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...