2017-02-28 7 views
2

Ich habe eine Anwendung mit UCWA und das Kennwort Token entwickelt. Ich lese alle Nachrichten, die zu dem mit der Anwendung authentifizierten Benutzer kommen, unter Verwendung von Ereignissen, aber das Token dauert nicht lange und die Erneuerung verwendet den Browser, was hinsichtlich der Automatisierung schrecklich ist.Aktualisieren UCWA-Token automatisch auf Skype für Business Online

Gibt es eine Möglichkeit, ein Token zu erhalten, das nicht über den Browser erneuert werden muss, damit ich meine Anwendung vollständig automatisieren kann? Ich habe die gesamte Dokumentation zu Github und auf der Website von ucwa gelesen.

Dies ist die Anfrage, die ich tun, um ein Token zu erhalten.

Holen Sie sich das signin url

def get_signin_url (redirect_uri, client_id, Mieter, Ressource): 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 

Nach mehreren Schritten , erhalten Sie das Token:

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)) 

Vielen Dank!

+0

Es sieht aus wie Sie Python verwenden. Gibt es einen Grund, warum Sie nicht die [ADAL-Bibliothek für Python] (https://github.com/AzureAD/azure-activedirectory-library-for-python) verwenden, um das Token ohne Verwendung eines Browsers zu erhalten? – ShelbyZ

+0

Vielen Dank für Ihre Antwort! Aber mein Hauptproblem ist nicht mit dem Active Directory-Token, sondern mit dem UCWA-Server, der anders ist. Obwohl ich versuchen werde, meine Lösung mit ADAL und die Antwort von Andrey Markeev zu verbessern. : +1: –

Antwort

1

Obwohl die Dokumentation aus irgendeinem Grund sagt, dass Sie einen impliziten Fluss benötigen, funktioniert Skype for Business Online in der Tat perfekt mit dem normalen Ansatz von authorization_token + refresh_token.

Ich denke, sie haben es nur noch nicht dokumentiert. Da dieser Ansatz mit allen anderen Office 365-APIs funktioniert, ist es sehr unwahrscheinlich, dass er entfernt wird.

So, nachdem Sie den Benutzer einmal autorisieren, müssen Sie tun - genau so, wie Sie in Ihrem Code haben:

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 
} 

, aber dann von Antwort, die Sie access_token UND refresh_token erhalten. refresh_token sollte irgendwo gespeichert werden (z.B. in der Datenbank) für die spätere Verwendung.

Jetzt verwenden Sie access_token, dann aber an einem gewissen Punkt, den Sie 403, empfangen und jetzt können Sie es mit Hilfe auffrischen die refresh_token Sie gespeichert zuvor:

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 
} 

Erfahrung zeigt, dass Tokenanforderung aktualisieren werden, selbst ausgeführt, wenn Es ist eine beträchtliche Zeit vergangen, seit access_token abgelaufen ist.

Ich verwende diesen Ansatz in mehreren Anwendungen, die Office 365-APIs verwenden, einschließlich einer, die mit Skype for Business interagiert, und bis jetzt gab es keine Probleme damit.

In Bezug auf die offizielle Dokumentation ist refresh_token für viele Subsysteme dokumentiert (nicht für Skype for Business zum Zeitpunkt des Schreibens), und überall funktioniert es fast identisch. Zum Beispiel ist hier eine solche Dokumentation für Azure AD:

+1

Hallo! Vielen Dank für Ihre Antwort, ich habe eine automatisierte Lösung, aber es ist nicht optimal, also werde ich versuchen, was Sie vorgeschlagen haben und Sie wissen lassen, ob es gut gegangen ist. Vielen Dank für Ihre Hilfe! :-) –

Verwandte Themen