2017-02-28 11 views
2

저는 UCWA와 암호 토큰을 사용하여 응용 프로그램을 개발했습니다. 이벤트를 사용하여 응용 프로그램으로 인증 된 사용자에게 오는 모든 메시지를 읽었지만 토큰은 오래 가지 않으며 갱신은 자동 화와 관련하여 끔찍한 브라우저를 사용하고 있습니다.Skype에서 UCWA 토큰을 자동으로 새로 고침

내 애플리케이션을 완전히 자동화 할 수 있도록 브라우저를 통해 갱신 할 필요가없는 토큰을 얻는 방법이 있습니까? 나는 Github과 ucwa 웹 사이트의 모든 문서를 읽었습니다.

토큰을 얻으려는 요청입니다.

로그인 절차의 URL을

데프 get_signin_url (redirect_uri로, CLIENT_ID, 거주자 자원) 얻기 : 여러 단계 후 xframe, user_discovery_uri 자원 = do_autodiscover (구성 [ '도메인'])

# 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

것 같습니다. broswer를 사용하지 않고 토큰을 얻기 위해 [ADAL library for Python] (https://github.com/AzureAD/azure-activedirectory-library-for-python)을 사용하지 않는 이유가 있습니까? – ShelbyZ

+0

답변 해 주셔서 감사합니다! 하지만 내 주요 문제는 Active Directory 토큰이 아니라 UCWA 토큰과 다릅니다. ADAL과 Andrey Markeev의 답변을 사용하여 솔루션을 개선 할 수 있도록 노력하겠습니다. +1 : –

답변

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이 얻을을 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이 만료 된 후 상당한 시간이 지났습니다.

저는 Skype for Business와 상호 작용하는 것을 포함하여 Office 365 API를 사용하는 여러 응용 프로그램에서이 접근법을 사용하고 있습니다. 문제는 없었습니다.

공식 문서의 측면에서 refresh_token은 많은 하위 시스템 (문서 작성 당시의 Skype for Business가 아님)에 대해 문서화되었으며 모든 곳에서 거의 동일하게 작동합니다. 예를 들어 여기에 푸른 광고에 대한 해당 문서 : 당신은 파이썬을 사용하는 것처럼

+1

안녕하세요. 귀하의 답변을 주셔서 감사합니다, 나는 automatised 솔루션을 가지고 있지만 최적이 아니므로, 나는 당신이 제안한 것을 시도해 볼 것이고 그것이 잘 진행 되었다면 알려주겠습니다. 도움 주셔서 감사합니다. :-) –