博客地址:http://blog.csdn.net/FoxDave
上一篇我们介绍了发起Microsoft Graph请求的核心:访问令牌。本篇我们探讨一下在使用Microsoft Graph进行查询时可能遇到的多种认证场景。
Microsoft标识平台实现了一些OAuth 2.0规格书中定义的认证场景。
授权代码流很可能是最常用的获取访问令牌的流。该流分为两个部分:认证/授权部分和令牌请求。
首先,用户信息被发送到Azure AD登录页。在web应用中,这是一个简单的跳转。在本地应用程序中,这包含了打开访问Azure AD网站的浏览器对话框。URL包含了标识发起请求的应用程序和请求的权限scopes的参数。如果用户是第一次使用应用程序(或者请求的权限级别跟上次用户使用应用程序时不同),所请求权限的列表会展示给用户,让用户进行查看并决定是否批准这些权限。
如果用户批准了请求的权限,浏览器会带着授权码一起跳转回应用程序。之后应用程序就可以把这个授权码和应用程序密钥发送POST请求到Microsoft标识平台令牌终结点去获取访问令牌了。
权限的类型
使用这种流的应用程序利用托管权限。从该流返回的访问令牌会带有一个用户上下文。
什么时候使用授权代码
如果应用程序:
使用授权代码是最佳选择。
隐式授权流的启动方式跟授权代码流一样,通过将用户跳转到Azure AD登录页。然而,这种流不返回授权码,而是返回访问令牌。
这种简化流用来支持用JavaScript实现的单页应用程序 (SPA)。由于这些应用程序完全地在用户的浏览器中运行,很可能是没有后台组件的,所以如果要进行授权代码流就会有如下困难:
这种流通过消除应用程序密钥并且不涉及POST请求来解决这些问题。
权限的类型
使用这种流的应用程序利用托管权限。从该流返回的访问令牌会带有一个用户上下文。
什么时候使用隐式授权
如果应用程序是客户端JavaScript单页应用程序并且没有后台组件,使用隐式授权流是最佳选择。
客户端凭据流不同于前面的两种流,体现在两个主要方面。首先,该流不需要任何用户交互,因此对于服务或无人值守进程应用程序是最好的选择。第二,该流使用应用程序权限,而不是托管权限。
尽管该流自身不需要用户交互,但需要组织的管理员对应用程序所需的权限进行批准。这是一个可以发生在应用程序注册时的一次性过程,或者我们可以构建一个最小的Web应用程序来让管理员去对应用程序进行认证和授权。
管理员对应用程序进行授权之后,应用程序就可以通过提供它的应用程序ID和密钥来获取访问令牌,或通过在应用程序注册时跟Azure AD共享的证书对请求令牌进行签名。
权限的类型
使用这种流的应用程序利用应用程序权限。从该流返回的访问令牌不会带有用户上下文,是对组织内的所有用户进行授权的。
什么时候使用客户端凭据
如果应用程序需要组织内的所有用户访问,不需要实现UI或运行在非用户交互的场景下(如服务、计划任务等),使用客户端凭据流是最佳选择。
代理流用于中间层服务场景。它通常包含一个使用授权代码或隐式授权的用户应用程序和一个受Azure AD OAuth保护的用于访问Microsoft Graph的Web API或服务。
在该流中,用户登录到前端的应用程序,获取一个向中间层服务授权的访问令牌。然后中间层服务使用该访问令牌来获取另一个访问令牌代理用户访问Microsoft Graph。
该流不同于正常的授权代码流,因为前端应用程序本身无法访问Microsoft Graph。
权限的类型
使用这种流的应用程序利用托管权限。从该流返回的访问令牌总是带有用户上下文。
什么时候使用代理
如果应用程序包含多个组件,包括前端用户应用程序和后端的Web API或服务,使用代理流是最佳选择。
Microsoft标识平台发布的访问令牌的生命周期是短暂的,一个小时之后过期。应用程序可以在用户不取消应用程序授权的情况下,请求新的访问令牌而不需要用户重新授权。做这个的方式取决于应用程序使用的流的类型。
读者可以通过浏览器或者Postman尝试授权代码流。