【发布时间】:2021-07-01 09:26:48
【问题描述】:
我有一个允许用户上传文件的 Angular 应用程序。我打算使用OneDrive API(我为应用程序设置的OneDrive 帐户)将这些文件存储在OneDrive 中。
我知道我们必须使用OAuth2.0 从网络服务器获取访问令牌并将该令牌用作不记名令牌以使用 API 来管理我在 OneDrive 中的文件。
如何在我的 Angular 应用中获取此访问令牌?
我需要获取访问令牌而不重定向到登录页面(无需用户交互)。 但在后台。
我尝试使用以下 URL 在 POSTMAN 中获取访问令牌。
我试过了,
- 客户端凭据流。
- 资源所有者流程。
- 隐式流。
Angular 中的隐式流函数 (我已经硬编码了要测试的 URL 和值)
getToken() {
var msFormData = new FormData();
msFormData.append('grant_type', 'client_credentials');
msFormData.append('client_id', 'client_id');
msFormData.append('client_secret', 'client_secret');
msFormData.append('resource', 'https://graph.microsoft.com');
return this.http.post("https://login.microsoftonline.com/{id}/oauth2/token", msFormData);
}
所有三个都在工作并且能够获得令牌。 当我在 Angular 中尝试隐式流时,我收到了 CORS 错误。 (无论如何我都不能使用隐式,因为客户端密码会被暴露)。
当尝试使用
Resource_owner流程时,我得到了SPO license错误信息。如果我使用user flow并检索访问权限 来自重定向 URL 的令牌。我可以使用 Graph API 访问令牌以获取驱动器项目。所以我知道我不需要 SPO 许可。(也许)
如果这不是我可以在后端创建服务以获取访问令牌/刷新令牌并使用 API 将其提供给 Angular 应用程序的最佳方式,那么用户可以从浏览器上传文件。但是从上述流程中获得的访问令牌给了我一个 SPO 错误。
更新: 我发现要访问一个驱动器,我们需要一个委托访问令牌。这与 client_credenttial 流有何不同?以及如何获得它们?
【问题讨论】:
-
// 您可以使用该示例以静默方式请求访问令牌,并且异步 getAccessToken() 工作: Promise
{ let result = await this.msalService.acquireTokenSilent(OAuthSettings) .catch(( reason) => { this.alertsService.addError('获取令牌失败', JSON.stringify(reason, null, 2)); }); if (result) { // 临时在错误框中显示 token this.alertsService.addSuccess('Token acquire', result.accessToken);返回result.accessToken; } // 无法获取令牌 this.authenticated = false;返回空值; -
顺便说一句,我使用了来自 step-by-step Angular SPA example uses Microsoft Graph API and OneDrive API 的代码示例。它对我有用。
-
但是这里我们只传递作用域。 Id, Secret.?我想在不显示登录表单的情况下将文件上传到我的一个驱动器
-
如果您需要委托令牌,则不能使用客户端凭据流。客户端凭证流只能获取应用token,即没有用户登录!
-
有没有办法在不交互的情况下获取委托令牌
标签: angular oauth-2.0 azure-active-directory microsoft-graph-api pkce