首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在创建()后获得邮箱?

如何在创建()后获得邮箱?
EN

Stack Overflow用户
提问于 2022-02-11 06:23:05
回答 1查看 1.4K关注 0票数 0

我已经成功地使用Azure和JAVA创建了一个MS Graph。我已经使用ClientSecretCredential进行身份验证。我相信接收到的访问令牌也是有效的。但是,我现在想要访问我的(outlook)邮箱,使用来统计我的收件箱文件夹中的电子邮件总数。请在下面找到我的代码和错误。我认为这是因为代码是用于委托的,而不是应用程序权限。帮帮忙吧。

代码语言:javascript
运行
复制
package JAVA_MicrosoftGraphAPI;

import java.net.URL;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.PropertyConfigurator;

import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.microsoft.graph.authentication.TokenCredentialAuthProvider;
import com.microsoft.graph.logger.DefaultLogger;
import com.microsoft.graph.logger.LoggerLevel;
import com.microsoft.graph.options.Option;
import com.microsoft.graph.options.QueryOption;
import com.microsoft.graph.requests.GraphServiceClient;
import com.microsoft.graph.requests.MessageCollectionPage;

public class soTest {

    // for requirements visit:
    // https://github.com/Azure/azure-sdk-for-java/wiki/Set-up-Your-Environment-for-Authentication#enable-applications-for-device-code-flow
    private final static String CLIENT_ID = "XXXXXXXXXXXXX";
    private final static String TENANT_ID = "XXXXXXXXXXXXX";
    private final static String SECRET_Value = "XXXXXXXXXXXXX";

    // Set the scopes for your ms-graph request
    private final static List<String> SCOPES = Arrays.asList("https://graph.microsoft.com/.default");

    public static void main(String[] args) throws Exception {


        final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(CLIENT_ID)
                .clientSecret(SECRET_Value)
                .tenantId(TENANT_ID)
                .build();


        final TokenCredentialAuthProvider tokenCredAuthProvider = new TokenCredentialAuthProvider(SCOPES, clientSecretCredential);
        System.out.println("First Step Reached. ");


        // Create default logger to only log errors
        DefaultLogger logger = new DefaultLogger();
        logger.setLoggingLevel(LoggerLevel.ERROR);


        // Build a Graph client
        GraphServiceClient graphClient = GraphServiceClient.builder()
                .authenticationProvider(tokenCredAuthProvider)
                .logger(logger)
                .buildClient();
        System.out.println("Second Step Reached. ");


        //      final OkHttpClient httpClient = HttpClients.createDefault(tokenCredAuthProvider);
        //      final Request request = new Request.Builder().url("https://graph.microsoft.com/v1.0/me").build();
        // Redirecting to web browser and signing in for authentication and connection.
        URL myUrl = new URL("https://graph.microsoft.com/v1.0/me/");
        final String accessToken = tokenCredAuthProvider.getAuthorizationTokenAsync(myUrl).get();
        System.out.println("Access token --> " + accessToken);


        LinkedList<Option> requestOptions = new LinkedList<Option>();
        requestOptions.add(new QueryOption("/select", "internetMessageHeaders"));

        MessageCollectionPage messages = graphClient.me().messages()
            .buildRequest( requestOptions )
            .get();
    
    }

}


Exception in thread "main" com.microsoft.graph.http.GraphServiceException: Error code: BadRequest
Error message: /me request is only valid with delegated authentication flow.

GET https://graph.microsoft.com/v1.0/me/messages?%2Fselect=internetMessageHeaders
SdkVersion : graph-java/v5.14.0


400 : Bad Request
[...]

[Some information was truncated for brevity, enable debug logging for more details]
    at com.microsoft.graph.http.GraphServiceException.createFromResponse(GraphServiceException.java:419)
    at com.microsoft.graph.http.GraphServiceException.createFromResponse(GraphServiceException.java:378)
    at com.microsoft.graph.http.CoreHttpProvider.handleErrorResponse(CoreHttpProvider.java:514)
    at com.microsoft.graph.http.CoreHttpProvider.processResponse(CoreHttpProvider.java:443)
    at com.microsoft.graph.http.CoreHttpProvider.sendRequestInternal(CoreHttpProvider.java:409)
    at com.microsoft.graph.http.CoreHttpProvider.send(CoreHttpProvider.java:226)
    at com.microsoft.graph.http.CoreHttpProvider.send(CoreHttpProvider.java:203)
    at com.microsoft.graph.http.BaseCollectionRequest.send(BaseCollectionRequest.java:103)
    at com.microsoft.graph.http.BaseEntityCollectionRequest.get(BaseEntityCollectionRequest.java:78)
    at JAVA_MicrosoftGraphAPI.soTest.main(soTest.java:75)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-18 13:11:11

您似乎在使用客户端凭据流。这意味着令牌将具有应用程序声明,即在应用程序的上下文中运行。因此,您不能在这里使用/me端点。

您可以使用用户/id代替。或者,您可以使用OAuth授权代码流(令牌将同时拥有用户和应用程序声明)来利用/me端点。

按照教程这里生成相应的访问令牌。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71075920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档