2017-02-28 20 views
2

私はUCWAとパスワードトークンを使ってアプリケーションを開発しました。私は、イベントを使ってアプリケーションで認証されたユーザーに届くすべてのメッセージを読んでいますが、トークンは長続きせず、更新はブラウザを使用しています。これは自動化に関する恐ろしいものです。SkypeでUCWAトークンを自動的に更新するビジネス用オンライン

私は自分のアプリケーションを完全に自動化することができるので、ブラウザ経由で更新する必要のないトークンを取得する方法はありますか?私はGithubとucwaウェブサイトのすべてのドキュメントを読んだ。

これはトークンを取得するためのリクエストです。

サインインのURL

はデフ(REDIRECT_URI、CLIENT_ID、テナント、リソースを)get_signin_url取得: 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

あなたのpythonを使用しているように見えます。 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は、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のため、このようなドキュメントがあります:

+1

こんにちは!あなたの答えをありがとう、私は自動化されたソリューションを持っていますが、それは最適ではないので、私はあなたが提案したものを試して、それがうまくいけばあなたに知らせるつもりです。 ありがとうございます! :-) –

関連する問題