MSAL для Android без использования Chrome

Я хочу интегрировать один диск (личный и рабочий), и для этого я использую msal. Я обнаружил, что для этого требуется хром. Я хочу в своем приложении не использовать хром (например, всплывающее окно или интерфейс приложения).

Я использую эту библиотеку для аутентификации (msal) https://github.com/AzureAD/microsoft-authentication-library-for-android

Есть ли какое-либо решение, доступное для Android?


person Manmohan Badaya    schedule 10.08.2017    source источник
comment
Вы спрашиваете, есть ли способ передать учетные данные пользователя в библиотеку MSAL, не открывая Chrome... или любой другой браузер, который пользователь настроил в качестве браузера по умолчанию для намерения браузера?   -  person John Austin    schedule 26.10.2017
comment
Я спрашиваю, не используя только хром.   -  person Manmohan Badaya    schedule 26.10.2017


Ответы (4)


Выпуск MSAL.Android 0.2.0 включает:

Поддержка всех основных браузеров на Android

https://github.com/AzureAD/microsoft-authentication-library-for-android/wiki/Миграция-из-MSAL.Android-0.1.n-to-0.2.0

person JorgeZapatero    schedule 26.03.2019

Для библиотеки MSAL требуется браузер, поддерживающий настраиваемые вкладки. Хром делает. комментарии кода из класса MSAL AuthenticationActivity сообщают нам, что действие запустится, только если установлен Chrome. В противном случае генерируется исключение. Библиотека с открытым исходным кодом, поэтому вы можете разветвить репозиторий и изменить класс AuthenticationActivity в соответствии со своими требованиями.

person John Austin    schedule 22.12.2017
comment
Спасибо за ссылку на код. Я посмотрю на это. На данный момент я исправил свою проблему, используя простой веб-просмотр. - person Manmohan Badaya; 22.12.2017
comment
@Manmohan, как ты этого добился? Вы изменили код, чтобы использовать ваш веб-просмотр? - person Rat-a-tat-a-tat Ratatouille; 24.12.2018
comment
@Rat-a-tat-a-tatRatatouille я загрузил URL-адрес аутентификации в веб-просмотре, который у меня сработал. - person Manmohan Badaya; 24.12.2018
comment
@Manmohan: А как ты вернул токен доступа? Этот способ также обрабатывает учетные записи mfa? - person Rat-a-tat-a-tat Ratatouille; 26.12.2018
comment
@Rat-a-tat-a-tatRatatouille, проверив URL-адрес. URL-адрес содержит информацию о маркере доступа. Да, по-моему, они должны относиться к этому так же. - person Manmohan Badaya; 26.12.2018
comment
@Manmohan, у тебя есть рабочая демоверсия? Я не могу понять, где мне может понадобиться добавить идентификатор клиента, который мы генерируем, если нам просто нужно использовать URL-адрес в нашем пользовательском веб-просмотре. - person Rat-a-tat-a-tat Ratatouille; 27.12.2018
comment
@Rat-a-tat-a-tatRatatouille Я добавлю немного кода, который определенно вам поможет. - person Manmohan Badaya; 27.12.2018
comment
@Manmohan: Конечно, это помогло бы. Спасибо - person Rat-a-tat-a-tat Ratatouille; 14.01.2019
comment
@Rat-a-tat-a-tatRatatouille Я добавил свой ответ. Пожалуйста, проверьте. - person Manmohan Badaya; 16.01.2019

Я загрузил ниже URL-адрес, используя веб-просмотр -

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=your_client_id&scope=offline_access+Files.ReadWrite+profile+openid+User.ReadBasic.All&redirect_uri=your_redirect_uri&prompt=login&response_type=code

это вернет код

который следует использовать для получения токена доступа, как показано ниже:

 private void requestForGetAccessToken(String code) {
    try {

        String bodyForAccessTokenRequest = getBodyForAccessTokenRequest(code);
         private static final String AUTHORITY = "https://login.microsoftonline.com/common/";
         private static final String URL_FOR_TOKEN = "oauth2/v2.0/token/" 
        URL mUrl = new URL(AUTHORITY + URL_FOR_TOKEN);
        HttpURLConnection httpConnection = (HttpURLConnection) mUrl.openConnection();
        httpConnection.setRequestMethod("POST");
        httpConnection.setDoOutput(true);
        httpConnection.setRequestProperty("Content-length", "" + bodyForAccessTokenRequest.length());
        httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        httpConnection.setUseCaches(false);
        httpConnection.setAllowUserInteraction(false);
        httpConnection.setConnectTimeout(100000);
        httpConnection.setReadTimeout(100000);

        OutputStream os = httpConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
        writer.write(bodyForAccessTokenRequest);
        writer.flush();
        writer.close();
        os.close();

        httpConnection.connect();

        int responseCode = httpConnection.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            String strRes = sb.toString();
            sendCode(strRes);
        }
    } catch (IOException e) {
        Logger.e("[OneDrivePersonalLoginManager][requestForGetAccessToken] IOException " + e.getMessage());
    } catch (Exception e) {
        Logger.e("[OneDrivePersonalLoginManager][requestForGetAccessToken] Exception " + e.getMessage());
    }
}


 private String getBodyForAccessTokenRequest(String code) {
    return CLIENT_ID_EQUAL + CLIENT_ID + appendAmpersand() + appendRedirectUri() + appendAmpersand() + CODE_EQUAL + code + appendAmpersand() + GRANT_TYPE_EQUAL + AUTHORIZATION_CODE;
}

Ответ на этот запрос POST вернет токен доступа.

person Manmohan Badaya    schedule 16.01.2019

Если кто-то все еще сталкивается с этой проблемой, текущая версия MSAL для Android позволяет использовать WebView вместо браузера. Если вы использовали ту же реализацию, что и в примере приложения, которое использует файл auth_config.json для конфигурации вашего приложения, просто измените пользовательский агент авторизации как веб-представление.

auth_config.json

{
  "client_id" : "<CLIENT_ID_FROM_https://apps.dev.microsoft.com>",
  "authorization_user_agent" : "WEBVIEW", 
  "redirect_uri" : "<CLIENT_ID_FROM_https://apps.dev.microsoft.com>://auth",
  "authorities" : [
   {
      "type": "AAD",
      "audience": {
         "type": "AzureADandPersonalMicrosoftAccount"
       }
   }
 ]
}

Вам также не нужно будет использовать фильтры Intent из предыдущей реализации, если вы пойдете по этому пути.

person kobowo    schedule 07.06.2019