能否获取永久Token?Outlook账户对接Web应用的持久授权配置咨询
要实现类似Slack的Outlook日历授权效果,让用户不用重复登录,核心是拿到能长期续期的refresh token,你需要做以下几个关键配置:
添加
offline_access权限
这是获取refresh token的核心前提,没有这个权限,Azure AD只会返回短期的access token。去Azure门户的应用注册里,找到你的应用→API权限→添加权限→选Microsoft Graph的委托权限,搜索offline_access并勾选,最后记得给这个权限授予管理员同意(如果是租户内应用的话)。授权请求必须包含
offline_accessscope
用户授权时,你的前端或后端发起的授权请求里,scope参数必须带上offline_access,比如要创建会议的话,scope应该是Calendars.ReadWrite offline_access——少了这个,就算权限加了也拿不到refresh token。调整Refresh Token的有效期配置
Azure AD默认refresh token有效期是90天,但可以通过配置让它在用户活跃时持续有效:- 如果是单租户应用,去Azure AD的企业应用里找到你的应用→令牌配置→设置刷新令牌的生命周期,最长可以设到90天,但只要用户持续使用(后端定期用refresh token续期),token会自动滚动刷新,不会过期。
- 多租户应用的话,默认滚动有效期也是90天,超过90天用户没使用就会过期,但正常使用下不会需要用户重新登录。
注意:如果用户改了密码、主动撤销了对你应用的授权,refresh token还是会失效,所以后端要处理刷新失败的情况,到时引导用户重新授权就行。
用授权码流程而非隐式授权
如果你之前用的是隐式授权(implicit flow),这种流程不会返回refresh token给后端,必须换成授权码流程(authorization code flow)。去Azure门户的应用注册→认证→添加平台→Web,勾选"授权码流"选项。后端正确存储和使用Refresh Token
后端要把用户的refresh token加密存在数据库里,当access token过期时,调用Azure AD的token端点,用refresh token换全新的access token和refresh token——每次刷新都会返回新的refresh token,记得替换旧的存储,不然旧的会失效。
示例请求(curl):curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=你的客户端ID" \ -d "client_secret=你的客户端密钥" \ -d "refresh_token=用户的refresh token" \ -d "grant_type=refresh_token" \ -d "scope=Calendars.ReadWrite offline_access"
内容的提问来源于stack exchange,提问作者Sohayb Saleh

