Сбор изображения профиля Azure в Java после входа в SAML

#java #azure #microsoft-graph-api #saml-2.0

#java #azure #microsoft-graph-api #saml-2.0

Вопрос:

После входа в SAML я хочу собрать изображение профиля пользователя. К сожалению, этого нет в атрибуте SAML. Я попытался найти решение и обнаружил, что мне нужно использовать graph api.

Поэтому я попытался использовать https://graph.microsoft.com/v1.0/me/photo /$вызов значения.

До этого мне нужен был токен на предъявителя

Я обнаружил, что могу вызвать https://login.microsoftonline.com//oauth2/v2.0/token использование этих параметров в form-data

 grant_type=client_credentials
client_id=<the Client Id of my application registered in Azure>
client_secret<the Client secret generated in Azure of my application>
scope=https://graph.microsoft.com/.default
  

После вызова этого я успешно получаю токен на предъявителя.
Но когда я использую его в вызове /photo / $value, я получаю эту ошибку:

 {
    "error": {
        "code": "UnknownError",
        "message": "{"error":{"code":"NoPermissionsInAccessToken","message":"The token contains no permissions, or permissions can not be understood.","innerError":{"requestId":"zzz","date":"2020-11-09T07:22:06"}}}",
        "innerError": {
            "date": "2020-11-09T07:22:06",
            "request-id": "zzzz",
            "client-request-id": "xxxx"
        }
    }
}
  

Что я делаю не так? Есть ли какой-либо другой метод, который я могу использовать в Java для получения изображения профиля?

Заранее большое спасибо

Ответ №1:

Пожалуйста, предоставьте оба разрешения ниже в разделе разрешения приложения и предоставьте согласие администратора.

И используйте GET /users/{id | userPrincipalName}/photo/$value .Пожалуйста, обратитесь к client-creds-grant-flow и auth-code-flow. введите описание изображения здесь

——————ОБНОВИТЬ——————

учебное пособие по консольному приложению Java.

Это пример списка пользователей ad только для страниц.Просто поместите следующий токен доступа в var accessToken=»ваш токен доступа***»******; и вы можете запустить его.

 <html>

    <style>
        .userItem {
          background-color:lightgrey; 
          list-style-type: none;
          margin: 0;
          padding: 0;
        }
        
        .userItem p {
          display: inline-block;
          width:25%
        }

        .LicenseItem {
          background-color: lightgoldenrodyellow;
          margin: 0;
          padding: 0;
          height: 45%;
          overflow: auto;
        }
        
        .LicenseItem p {
          display: inline-block;
          width: 20%;
      
        }
     

        .loadMore {
            background-color: aqua;
            font-style: italic; 
            text-align: center; 
            padding: 15px;
        }
        </style>

    <body>
        <div id="message"></div>
        <div id="userListView">
            <div class="userItem" style="background-color: aqua;font-style: italic;">
                <hr>
                <p> user display name </p>
                <p> user email address </p>
                <p> user principal name </p>  
            </div>
            <div id="userList"></div>
            <div id="loadMore" class="loadmore"></div>
        </div>
    </body>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

    <script>
        var accessToken="your access token*********";
        var ItemView = " <div id='@id' class='userItem'><hr><p id='@id-obj' style='display:none'>@obj</p><p > @displayName </p><p > @mail </p><p > @upn </p></div>"
        function initPage(){
            $("#loadMore").empty();
            $.ajax({
                url: 'https://graph.microsoft.com/v1.0/users?$top=10',
                type: 'get',
                headers: {
                    "Content-type": 'application/json', 
                    "Authorization":"Bearer "   accessToken
                },
                success: function (data) {
                    var userlist = data.value;
                    var nextpageUrl = data['@odata.nextLink'];
                    if(nextpageUrl){
                        $("#loadMore").append("<div onclick='loadMore(""  nextpageUrl   " ")'>load more...</div>");
                    }
                    userlist.forEach(element => {
                        var view = ItemView.replace(/@id/g,element.id).replace("@displayName",element.displayName).replace("@mail",element.mail).replace("@upn",element.userPrincipalName).replace("@obj",JSON.stringify(element));
                        console.log(JSON.stringify(element));

                        $("#userList").append(view);
                    });
                },
                error:function(data){
                    var response = JSON.parse(data.responseText)
                document.getElementById("message").innerHTML="ERROR:"   response.error.message;
                }
            });
        }

        function loadMore(url){

            $.ajax({
                url: url,
                type: 'get',
                headers: {
                    "Content-type": 'application/json', 
                    "Authorization":"Bearer "   accessToken
                },
                success: function (data) {
                    var userlist = data.value;
                    var nextpageUrl = data['@odata.nextLink'];
                    
                    if(nextpageUrl){
                        $("#loadMore").empty();
                        $("#loadMore").append("<div onclick='loadMore(""  nextpageUrl   " ")'>load more...</div>");
                    }
                    userlist.forEach(element => {
                        var view = ItemView.replace(/@id/g,element.id).replace("@displayName",element.displayName).replace("@mail",element.mail).replace("@upn",element.userPrincipalName).replace("@obj",JSON.stringify(element));
                        $("#userList").append(view);
                    });
                },
                error:function(data){
                    var response = JSON.parse(data.responseText)
                    document.getElementById("message").innerHTML="ERROR:"   response.error.message;
                }
            });
        }
        initPage();

    </script>

</html>
  

Комментарии:

1. Я попрошу администратора добавить разрешение приложения, но почему я не могу использовать разрешение делегата?

2. @MarioDeCarli Вы используете поток client_credentials, он не поддерживает вызовы api, требующие от пользователя входа в систему. Конечной точке / me требуется, чтобы пользователь вошел в систему. Если вы хотите использовать эту конечную точку, вы можете использовать другой поток для получения токена, например поток кода авторизации или поток паролей владельца ресурса (поток ROPC).

3. Поскольку я вхожу в систему через SAML, почему я не могу получить токен в утверждении, чтобы я мог получить доступ к информации о пользователе?

4. Вы были правы. Но теперь, когда у меня есть изображение в ответе, как мне записать его в браузер?

5. @MarioDeCarli Вам нужно веб-приложение java, интегрированное с ad, и, к сожалению, я не знаком с Java. Вы задаете другой вопрос для лучшей помощи, я обновил некоторую информацию в ответе. Если мои предыдущие ответы были вам полезны, вы можете принять их в качестве ответа, что было бы полезно для других членов сообщества.:)