我使用UCWA和密码令牌开发了一个应用程序。我正在阅读使用事件通过应用程序验证的用户的所有消息,但令牌不会持续很长时间并且续订正在使用浏览器,这对于自动化非常糟糕。
有没有办法获得一个不需要通过浏览器续订的令牌,这样我可以让我的应用程序完全自动化?我已经阅读了Github和ucwa网站上的所有文档。
这是我获取令牌的请求。
获取登录网址
def get_signin_url(redirect_uri,client_id,tenant,resource): xframe,user_discovery_uri,resource = do_autodiscover(config [' domain'])
# Build the query parameters for the signin url
params = {
'client_id': client_id,
'redirect_uri': redirect_uri,
'response_type': 'token',
'response_mode': 'form_post',
'resource': resource
}
# The authorize URL that initiates the OAuth2 client credential flow for admin consent
authorize_url = '{0}{1}'.format(authority, '/%s/oauth2/authorize?{0}' % tenant)
# Format the sign-in url for redirection
signin_url = authorize_url.format(urlencode(params))
return signin_url
完成几个步骤后,获取令牌:
def get_token_from_code(client_id, tenant, auth_code, redirect_uri, resource, client_secret):
# Build the post form for the token request
post_data = {
'grant_type': 'authorization_code',
'code': auth_code,
'redirect_uri': redirect_uri,
'resource': resource,
'client_id': client_id,
'client_secret': client_secret
}
# The token issuing endpoint
token_url = '{0}{1}'.format(authority, '/{0}/oauth2/token'.format(tenant))
# Perform the post to get access token
response = requests.post(token_url, data=post_data)
try:
# try to parse the returned JSON for an access token
access_token = response.json()['id_token']
return access_token
except:
raise Exception('Error retrieving token: {0} - {1}'.format(
response.status_code, response.text))
谢谢!
答案 0 :(得分:1)
虽然文档说由于某种原因需要隐式流,但实际上Skype for Business Online与普通的authorization_token + refresh_token方法完美配合。
我认为他们还没有记录下来。由于此方法适用于所有其他Office365 API,因此它不太可能被删除。
因此,在您授权用户一次之后,您需要这样做 - 完全按照您的代码进行:
POST https://login.microsoftonline.com/common/oauth2/token
{
grant_type: "authorization_code",
code: authorization_code,
redirect_uri: redirect_uri,
client_id: client_id,
client_secret: client_secret
}
,但然后从响应中获得access_token AND refresh_token 。 refresh_token应保存在某处(例如在数据库中)供以后使用。
现在,您使用access_token
,但在某些时候您会收到403,现在您可以使用之前保存的refresh_token
刷新它:
POST https://login.microsoftonline.com/common/oauth2/token
{
refresh_token: refresh_token,
grant_type: "refresh_token",
redirect_uri: redirect_uri,
client_id: client_id,
client_secret: client_secret
}
经验表明,即使自access_token过期以来已经过了很长时间,也可以执行刷新令牌请求。
我在几个使用Office 365 API的应用程序中使用此方法,包括与Skype for Business交互的应用程序,并且到目前为止没有任何问题。
就官方文档而言,许多子系统都记录了refresh_token(在撰写本文时不适用于Skype for Business),并且它的工作方式几乎相同。例如,这里是Azure AD的此类文档: