我正在尝试为Office 365构建一个多租户应用程序,该应用程序专注于SharePoint Online并使用OAuth2通过Azure进行身份验证.此问题特定于通过Azure登录进行SharePoint访问,但仅在使用此API使用OAuth2进行身份验证时才会发现.
正确注册应用程序并在Azure和Office中设置用户的许多机制虽然有些复杂,但却能够充分利用时间投资.
即使Azure的基本OAuth2协议使用也相对顺利.但是,凭借SharePoint的"资源"参数,我无法使我的应用程序成为真正的多租户.这显然要求我的应用程序在完成登录序列之前知道最终用户的根SharePoint站点URL.我看不出这是怎么可能的.有人请指出我正确的方向.
以下是实际登录顺序的示例:
GET /common/oauth2/authorize?client_id=5cb5e93b-57f5-4e09-97c5-e0d20661c59a
&redirect_uri=https://myappdomain.com/v1/oauth2_redirect/
&response_type=code&prompt=login&state=D79E5777 HTTP/1.1
Host: login.windows.net
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
当用户进行身份验证时,这会导致调用重定向,如下所示:
https://myappdomain.com/v1/oauth2_redirect/?code=AAABAAAAvPM1KaPlrEq...{blah*3}
Run Code Online (Sandbox Code Playgroud)
到目前为止很棒!3-legged身份验证的下一步是POST返回/ token端点,以获取要在所有后续REST调用中使用的实际Bearer令牌.这只是经典的OAuth2 ......
POST /common/oauth2/token HTTP/1.1
Host: login.windows.net
Accept: text/json
Cache-Control: no-cache
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="grant_type"
authorization_code
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="code"
AAABAAAAvPM1KaPlrEq...{blah*3}
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="client_id"
5cb5e93b-57f5-4e09-97c5-e0d20661c59a
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="client_secret"
02{my little secret}I=
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="redirect_uri"
https://myappdomain.com/v1/oauth2_redirect/
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="resource"
https://contoso.sharepoint.com/
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Run Code Online (Sandbox Code Playgroud)
而且这里变得粘稠."resource"参数是必需的,并且必须指向您要访问的特定于用户的端点.对于Exchange或Azure,端点始终相同.(https://graph.windows.net或https://outlook.office365.com)但SharePoint对每个租赁都有不同的端点.您尚未实际登录该用户,但您已经需要有关您尚未拥有的用户的信息.
如果我部署的应用程序版本假设"contoso"作为租户名称(如上所述),那么只有contoso租户中的用户才能成功使用我的应用程序读取SharePoint数据.一旦fabrikam中的另一个用户尝试使用它,我POST到/token端点就会要求获得错误站点的许可......而且还有问题.
我怎样才能检测到正确的端点POST到/token先于实际登录用户端点?是否有一些我可以使用的隐藏信息给我?是否有某种发现可以检测租户的根SharePoint URL?或者更好的是,是否有一个端点,我可以作为可以代表租户家的资源(类似的东西 …