1

我正在尝试构建一个客户端系统,该系统在 Outlook 中获取用户电子邮件的收件箱。要求是系统应该要求用户通过 Outlook 登录一次以进行身份​​验证,并且它应该能够在没有任何登录提示的情况下通过图形 API 获取电子邮件和其他操作,如回复、转发等。为此,我尝试使用 MS Graph SDK 并选择了相同的授权代码流。我按照以下步骤

  1. 使用以下链接请求授权代码:https ://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?client_id=clientId&response_type=code&redirect_uri=http%3A%2%2Flocalhost%2Fmyapp%2F&scope=https %3A%2F%2Fgraph.microsoft.com%2Fmail.read%20api%3A%2F%2F

  2. 我已将此授权代码存储到数据库并使用以下代码段进行授权。

    final AuthorizationCodeCredential authCodeCredential = new AuthorizationCodeCredentialBuilder()
    .clientId("client id")
    .clientSecret("client secret") 
    .authorizationCode("authcode from the db for that user")
    .redirectUrl("http://localhost:8080/redirect/url")
    .build();
    
    final List<String> scopes = new ArrayList<String>();
    scopes.add("Mail.Send");
    scopes.add("offline_access");
    scopes.add("openid");
    
    final TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(scopes, authCodeCredential);    
    GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient();
    
    MessageCollectionPage messages = graphClient.me()
    .messages()
    .buildRequest()
    .get();
  1. 这在第一次通过用户交互获取获取的授权代码时有效,但是当重复使用相同的代码以避免用户交互时,它会抛出以下内容

AADSTS54005:OAuth2 授权代码已兑换,请使用新的有效代码重试或使用现有的刷新令牌。

这是否意味着要使此流程正常工作,我必须要求我的用户每次都登录以通过图形客户端进行单个 API 调用。有什么方法可以使用在 AuthorizationCodeCredential 中获得的访问代码并将其与 GraphServiceClient 一起使用,以使用 SDK 访问 microsoft Graph API。将非常感谢任何形式的帮助。谢谢你

4

0 回答 0