我正在尝试构建一个客户端系统,该系统在 Outlook 中获取用户电子邮件的收件箱。要求是系统应该要求用户通过 Outlook 登录一次以进行身份验证,并且它应该能够在没有任何登录提示的情况下通过图形 API 获取电子邮件和其他操作,如回复、转发等。为此,我尝试使用 MS Graph SDK 并选择了相同的授权代码流。我按照以下步骤
我已将此授权代码存储到数据库并使用以下代码段进行授权。
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();
- 这在第一次通过用户交互获取获取的授权代码时有效,但是当重复使用相同的代码以避免用户交互时,它会抛出以下内容
AADSTS54005:OAuth2 授权代码已兑换,请使用新的有效代码重试或使用现有的刷新令牌。
这是否意味着要使此流程正常工作,我必须要求我的用户每次都登录以通过图形客户端进行单个 API 调用。有什么方法可以使用在 AuthorizationCodeCredential 中获得的访问代码并将其与 GraphServiceClient 一起使用,以使用 SDK 访问 microsoft Graph API。将非常感谢任何形式的帮助。谢谢你