#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. Вы задаете другой вопрос для лучшей помощи, я обновил некоторую информацию в ответе. Если мои предыдущие ответы были вам полезны, вы можете принять их в качестве ответа, что было бы полезно для других членов сообщества.:)