参考内容:
OAuth2 in Python | TestDriven.io
代表用户获取访问权限 - Microsoft Graph | Microsoft Learn
首先需要了解的是,通过Microsoft平台做身份验证,有一些配置时拿到的参数不可或缺(在身份验证的步骤中会用到,不一定是同一个步骤用到),其中包括:
client_id:应用程序id
client_secret:应用程序密钥
authority:
微软提供的authority形如https://login.microsoftonline.com/Enter_the_Tenant_Name_Here,Tenant_Name是租户id,在配置微软账号的时候会给出,是使用者一开始就会已知的参数
redirect_uri:身份验证成功后重定向到的指定网址
scope:服务端配置的允许客户端访问资源的作用域(类似于能访问到什么样的程度),是OAuth2.0的一种机制
state:一串应用提供的随机数,用于方便检测跨站点请求伪造(CSRF)针对客户端的攻击(见微软官方文档说明)
code:获取access_token必需的参数,一开始未知,需要服务端返回
访问用户资源的流程如下图所示:
大体上来说包括3步:①获取授权(拿到code) ②通过code拿到access token ③通过access token访问资源。
获取授权(拿到code)
在实践时,通过将client_id,response_type,redirect_uri,scope和state发送给形如authority+/oauth2/v2.0/authorize 的终结点来拿到code。
❀ 需要注意的是,response_type是在这一步必须要携带的参数,且response_type=code,官网还提供了一个参数叫response_mode,但是它不是必需的参数,不加也可以,如果要加,可以把response_mode设置成query或者form_post
拿到access token
会发现通过上一步之后,code会附在redirect_uri的 '?' 之后,形如 redirect_uri?code=xxxx ,所以很容易就能想到通过request.args.get('code')拿到这一串code。
然后我们通过将client_id,client_secret,code,redirect_uri,grant_type,include_client_id
发送给形如 authority+/oauth2/v2.0/token 的终结点来拿到access token。
❀ 需要注意的是,在实践中,如果使用了python的oauthlib这个第三方库(一般为了方便还是会使用),在数据中就不需要带有grant_type,因为oauthlib会默认帮你添加(参见web_application.py)
❀ include_client_id的默认值是True,是为了防止发送数据时还未授权(已经授权过其实不需要这个参数,如果为了保险也可以加,没什么影响)
通过access token访问用户资源
通过上一步操作,可以在返回的json格式数据中找到access_token字段,这就是访问用户资源的🔑。(我们离成功已经很接近了!!!!....)
这一步我们只需要把access_token包含在请求标头,向https://graph.microsoft.com/v1.0/me 请求用户资源即可,标头可形如:
header = {
'Authorization': 'Bearer {}'.format(client.token['access_token'])
}
这个意思就是,标头的形式是 Bearer xxxxx(xxxxx是access token)
至于为什么要用Bearer开头,有部分文章说是Authorization头定义的schema,除了Bearer以外还有其他的schema,如果按照官方资料来简单理解,Bearer Token就是一个OAuth2.0访问资源的标准规范,有兴趣可以看这个介绍文档:
RFC 6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage (rfc-editor.org)
另外还需要注意的是,这个网关中间的部分确实是/v1.0/,不像其他的终端节点是/v2.0/。
Microsoft Graph是一个可以访问Microsoft云中海量数据的API(稍加尝试,可以发现,如果用的是https://graph.microsoft.com/v1.0/users,会得到所有进行过身份验证的用户的信息....),返回的也是json格式的数据,其中可能包括用户的姓名、邮箱、职业等.....后续可以根据项目和个人需求拿取字段使用。
以上就是根据OAuth2.0在Microsoft平台进行身份验证(单点登录sso)的流程。本文叙述的是通过python来进行的操作,因为python有自带一些第三方库来简化操作,如果使用其他的编程语言,流程也类似,只是可能在向服务端发送凭据时需要特别注意不要漏掉某些字段。