当前位置: 首页 > 知识库问答 >
问题:

403:使用Microsoft Graph从服务器端应用程序读取邮件时被禁止

曹臻
2023-03-14

我正在开发一个服务器端应用程序,用于从我们的Office 365中检索电子邮件,过滤电子邮件并将其存储在我们的数据库中,而无需用户登录。如果您想查看一些详细信息,请参阅我之前问题的链接。

我有以下方法

@Test
    public void testGetAccessTokenDeamon() throws Exception {

        String tenant="f0245-fd24-r3s-be8a-7745gra60be3";
        String authority = "https://login.windows.net/"+tenant+"/oauth2/authorize";
        ExecutorService service=null;
        service= Executors.newFixedThreadPool(1);

        try{

            AuthenticationContext authenticationContext= new AuthenticationContext(authority,false,service);
            String certFile="/mycert.pfx";
            InputStream pkcs12Cert= new SharedFileInputStream(certFile);

            AsymmetricKeyCredential credential=AsymmetricKeyCredential.create("g564f4-e53c-45b7-938a-gt6445gy667",pkcs12Cert,"passwd");


            Future<AuthenticationResult> future=authenticationContext.acquireToken("https://graph.microsoft.com",credential,null);

            System.out.println("Token Received"+future.get().getAccessToken());
            String token = future.get().getAccessToken();

            HttpGet httpGet = new HttpGet("https://graph.microsoft.com/v1.0/users");

            httpGet.setHeader("Authorization", "Bearer "+token);


            GraphServices graphServices = new GraphServices();
            ResponseEntity<String> responseEntity;


            responseEntity = graphServices.getEmails(token);




            //HttpClient httpClient= HttpClients.createDefault();

            //HttpResponse response=httpClient.execute(httpGet);
            //HttpEntity entity=response.getEntity();

        }
        catch (MalformedURLException e){
            e.printStackTrace();

        }
        catch (Exception e){
            e.printStackTrace();
        }


    }

public ResponseEntity<String> getEmails(String accessToken) throws Exception
    {
        logger.info("In getEmails");

        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        HttpEntity<String> request;

        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        headers.add(AuthorizationConstants.AUTHORIZATION, AuthorizationConstants.BEARER + " " + accessToken);
        request = new HttpEntity<String>(headers);

        ResponseEntity<String> response = restTemplate.exchange("https://graph.microsoft.com/v1.0/users/abc@microsoft.com/messages", HttpMethod.GET, request, String.class);
        return response;
    }

如果我尝试使用https://graph.microsoft.com/v1.0/users/在rest Temboard我将得到一个用户列表,但对于一个特定的用户,上面的代码返回403。

您能否建议我使用哪些endpoint,以便我的应用程序无需用户登录即可访问单个消息?我已经为应用授予了所有必要的权限(委托和应用权限)。

更新:这是我在 http://jwt.calebb.net/ 上运行令牌时所拥有的,找不到 scp/scope 部分。

{
 typ: "JWT",
 alg: "RS256",
 x5t: "xxxxx_mfg5JKHrwLBbd_4s",
 kid: "xxxxx_mfg5JKHrwLBbd_4s"
}.
{
 aud: "https://graph.microsoft.com",
 iss: "https://sts.windows.net/f456fyu44-df44-d3t3-f342-66423er4323/",
 iat: 1473280446,
 nbf: 1473280446,
 exp: 1473284346,
 appid: "4fw423gh-er423-45b7-zd32-3fwer2343szd",
 appidacr: "2",
 e_exp: 10800,
 idp: "https://sts.windows.net/g0412253-aeb2-4a8a-ju76-8736272a3u7e3/",
 oid: "33dd3455-0195-4708-rt44-34552321ds32d2",
 sub: "33dd3455-0195-4708-813d-34552321ds32d2",
 tid: "33dd3455-ae23-r456-be8a-7737cf4321d2e3",
 ver: "1.0"
}.
[signature]

以下是我为该应用程序授予的权限(目前所有权限)。

Microsoft Graph-应用程序权限:18-委派的权限:40 Windows Azure Active Directory-应用程序的权限:4-委派的权利:8 Office 365 Exchange Online-应用程序权利:9-委派的权力:30

共有1个答案

单于钊
2023-03-14

我已经为应用程序提供了所有必要的权限(委托和应用程序权限)。

大概不是这样的:)。通常,403 forbidden意味着您的令牌没有您调用的API所需的作用域(在< code>scp声明中)。找出答案的简单方法是:在调试器中获取令牌(这是一个很长的base64字符串),然后去http://jwt.calebb.net/并粘贴它。您将看到它被解码成一个JSON web令牌。寻找< code >角色声明:

roles: [
  "Calendars.Read",
  "Mail.Read",
  "Contacts.Read" 
],

如果您没有 Mail.Read 或 Mail.ReadWrite则您没有配置必要的权限。

 类似资料:
  • 问题内容: 我正在尝试使用来自Python的SSH从服务器读取文件。我正在使用Paramiko进行连接。我可以连接到服务器并运行类似的命令,然后从服务器获取数据,但是我尝试读取的某些文件的大小约为1 GB或更大。 如何使用Python在服务器上逐行读取文件? 附加信息:通常要做的是运行命令并将结果存储在变量中并加以解决。但是由于这里的文件很大,我正在寻找一种从服务器逐行读取文件的方法。 编辑:我可

  • 在一段时间内,通过HTTPS与我们的服务器的通信工作得很好。 上周提供商更改了一些东西,从现在开始,我总是得到403错误。 我使用最新的OpenSSL DLLs V0.9.8 我已将UserAgent更改为“Mozilla/5.0(Windows NT 10.0)” SSL方法为“SSLVSSLV23” SSL模式为“SSLMClient” 什么都帮不上忙。:( 这是我得到的日志:

  • 问题内容: 我正在尝试从POP3获取邮件(我正在使用POP3邮件服务器,并且正在尝试获取邮件内容并将其存储到我的项目的数据库表中。),但是我找不到所有的PHP脚本仅适用于IMAP。 您知道如何从POP3服务器中提取邮件吗? 谢谢。 问题答案: 令人惊讶的是,PHP的imap库也可以用于处理POP3邮箱。当然,大多数高级IMAP功能都无法使用(例如,文件夹或获取邮件部分),但是已实现了基本的POP3

  • 问题内容: 我正在使用.js客户端,并且有我需要写到服务器上文件的对象。有两个问题-使用JavaScript进行文件I / O对我来说是新手…我正计划使用jquery和json。我正在使用Java服务器端。我从servlet读取的内容没有问题,但是文件I / O杀死了我!几个问题: 我可以使用$ .ajax调用打开通过.js生成的文件,但是它无法处理json语法(我尝试了$ .getJson和$

  • 我有一个反应式(springwebflux)web应用程序,在这个应用程序中,我只有很少的restapi是受保护的资源。(Oauth2)。要手动访问它们,我需要获取一个具有客户端凭据授权类型的授权令牌,并在请求中使用该令牌。 现在,我需要编写测试,通过Spring的WebTestClient调用API。我被禁止尝试访问API。在编写测试用例时,我哪里做错了。 以下是我的安全配置: 注意:-我需要这

  • C# 窗体应用 有什么办法可以防止windows在服务中禁用对应的服务呢。 使用 hook