OAuth 2.0を使った認証

概要

Ustreamでは、サードパーティ製のクライアントソフトはHTTPベース(RESTful)のAPIを使ってユーザーのリソース(データ)にアクセスすることができます。 また、ユーザーのチャンネルへ映像配信することができる放送配信者用ライブラリも使用することができます。 REST APIと 放送配信者用ライブラリは両方とも OAuth 2.0 プロトコルを使って認証と認可を行っています。

基本的な動作の流れ

サードパーティ製クライアントソフトの基本的な動作の流れは以下の通りです。:

  1. ユーザー認証: ユーザー識別情報(ユーザー名とパスワード)を取得し、その権限を有効にします。 クライアントソフトはこれらのユーザー識別情報を絶対に決して保存はせず、認 証のためにサーバへ送信するだけにしてください。
  2. アクセストークンの取得:ユーザ識別情報が正しく入力された場合、サードパーティ製クライアントソフトはアクセストークンを取得することができます。 一度このトークンを取得 すると、トークンが期限切れとなるかユーザーがUsteamのサイト上でそのトークンを無効にするまで、そのユーザーのリソースにアクセスすることができます。
  3. ユーザーリソースへのアクセス:クライアントソフトは、UstreamのREST APIや配信者用ライブラリを使用してユーザーのリソース(データ)にアクセスしたり、 ユーザーのチャンネルに映像を配信することができます。クライアントソフトは、アクセストークンを使って自身の認証を行います。 詳しい認証方法についてはOAuth 2.0プロトコルの技術文書にて説明がされています。

認証フロー

OAuth 2.0プロトコルでは、最初に行われる2フェイズにていくつかのフロー(ワークフロー)が使用されます。 使用されるフローは、クライアントソフトの種類やアーキテクチャに最も最適なものが選ばれます。Ustreamでは以下のフローをサポートしています。:

  • 暗示フロー(Implicit flow):デスクトップパソコンや携帯端末で動くネイティブのクライアントソフトのように、スタンドアローンの環境に適しています。 ユーザは自身のユーザー識別情報を安全なログイン用ウェブページに入力します。ログイン後、ブラウザは 専用の URL (クライアントソフトによって定義されたURL)にリダイレクトされます。 アクセストークンはURL内に埋め込まれて表示されます。
  • 認証コードフロー(Authorization code flow):クライアント機能とサーバ機能を併せ持つウェブサイトの場合に適したフローです。 ユーザは自身のユーザー識別情報を安全なログイン用ウェブページに入力します。ログイン後、ブラウザは 専用の URL (クライアントソフトによって定義されたURL)にリダイレクトされます。 認証コードはURL内に埋め込まれて表示されます。その認証コードを使い、バックグラウンドで別のHTTPリクエストを送ってアクセストークンを取得します。 サードパーティ製のクライアントソフトがクライアント・サーバ型なのであれば、この方法のほうが暗示フローよりも安全です。 詳細についてはOAuth2の技術文書を参照してください。

エンドポイント

認証処理時に呼び出されるウェブページやHTTPサービスはエンドポイントと呼ばれます。Ustreamには以下のエンドポイントがあります:

  • 認証エンドポイント:これはユーザーが自分のユーザ識別情報を入力するウェブページのことです。
  • トークンエンドポイント: 認証コードフロー使用時に、アクセストークンを取得することができるHTTPサービスのことです。 (暗示フロー使用時には、アクセストークンは認証エンドポイントから直接取得することができます。

アクセストークン

アクセストークンには二種類のものがあります: ベアラートークン(Bearer tokens)MACトークン(MAC tokens)です。Ustream のREST API上で使う分には、 これら二つのトークンは同じリソースにアクセルすることができるのでなんら変わりはありません。ベアラートークンはHTTPSのように暗号化されたチャンネルでのみが使用でき、 同様に暗号化されていないチャンネルではMAC トークンの使用が適している、といった違いがあります。

クライアントソフトが Ustream の映像配信者用ライブラリを使うのであれば、必ずMAC トークンを使わなければなりません: 映像配信はRTMPプロトコル上で実行されているので 暗号化されていないためです。クライアントソフトがREST APIのみを使用するのであれば、ベアラートークンのほうが良いでしょう。REST APIはシンプルで軽量な実装がされているからです。

ベアラートークン と MAC トークン は同じ方法で取得することができます:認証エンドポイントにはトークンの種類を決めるパラメータがあり、 クライアントソフト側でどのトークンを使うか指定することができます。

トークンスコープ, 期限切れ

既定ではアクセストークンには有効期間が設定されており(だいたい1日で期限切れになります。)、一部のリソースにしかアクセスすることができません。 認証処理において、クライアントはそういった制限を取り払うための特別な許可(スコープ)を要求することができます。 この要求は、認証エンドポイント上でユーザーに対して表示されます。 Ustreamでは現在以下のスコープをサポートしています。:

  • オフラインスコープ: このスコープが有効になっているとトークンは期限切れにはなりません。
  • 映像配信者スコープ: このスコープが有効になっていると、Ustream映像配信用ライブラリを使った映像配信にアクセストークンを使用することができます。 このスコープは MAC tokensでのみ有効にできます。

OAuth2 認証サーバエンドポイント

認証エンドポイント

URL https://www.ustream.tv/oauth2/authorize
サポートしている認証フロー 認証コードフロー、暗示フロー
サポートしている HTTP メソッド GET, POST

認証エンドポイントとは、ログインフォームを持った安全なウェブページのことです。 クライアントソフトでは、付属のブラウザ機能を使って、このウェブページをユーザーに表示するようにしてください。 ユーザーのログイン操作が完了すると、ブラウザが専用のURLへとリダイレクトされます。 クライアントソフトはこのリダイレクトコールから、認証コードやアクセストークンを取得できます。 (認証コードとアクセストークンのどちらを取得できるかは、使用する認証フローによって変わります。)



以下のパラメータによって認証エンドポイントの動作が変わります。 HTTPプロトコルでGETやPOSTを実行する際には、これらのパラメータに値を設定しなければなりません。

サポートしているOAuth 2.0 の標準パラメータ:

パラメータ タイプ 重要度 説明
response_type string REQUIRED 認証コードフローの場合は"code"となります; 暗示フローの場合は"token"となります。
client_id string REQUIRED クライアントを識別するための40 文字のsha1 ハッシュです。この値はUstream側で設定されます。
redirect_uri string REQUIRED このURLは、認証処理後にブラウザがリダイレクトされるURLです。 The prefix of this URI must be registered at Ustream.
state string OPTIONAL この値は、XSRFアタックを防ぐためにGETパラメータとしてredirect_uriに埋め込まれます。詳細については OAuth2の技術文書を参照してください。
scope string OPTIONAL オフラインスコープの場合は"offline"となり、映像配信者スコープの場合は"broadcaster"となり、区切り文字にはスペースを使用します。


Ustream独自の拡張パラメータ:

パラメータ タイプ 重要度 説明
token_type string OPTIONAL アクセストークンの種類を表します。このパラメータを設定する場合、ベアラートークンを使うのであれば"bearer"、 MAC トークンを使うのであれば "mac"と設定するようにしてください。既定では"bearer"が設定されています。
device_name string OPTIONAL クライアントとなる端末やアプリケーションの、正式な製品名です。 これはOAuth2トークンの簡易識別に使われます。ユーザは自分のアカウントにアクセスしているクライアントを確認し、 Ustreamのウェブサイト上でそれらの承認を取り消すことができます。
display string OPTIONAL "touch"と設定された場合、携帯に最適化された画面が表示されます。
lang string OPTIONAL 指定した値(en_USなど)に応じた国・地域ごとの認証ページを表示します。; またこのパラメータによって、新規に登録されたユーザの使用言語も設定されます。 使用できる国・地域情報についてはセクション4.2.1. を参照してください。


戻り値:

以下の戻り値は、redirect_uriにHTTP GETパラメータとして埋め込まれます。

response_type パラメータに"code"と設定されている場合、以下の値が返ってきます。:

名前 説明
code 認証コード(長さは40 文字, 16進で暗号化された sha1 ハッシュ)
state エンドポイントに対してstateパラメータを設定して送信していた場合、Ustream側から送り返されてきます。

(メモ:現在、認証コードフローにおいてMAC トークン は実装されていません。)



response_typeパラメータに"token"と設定されてtoken_typeパラメータに"bearer"と設定されている(もしくは何も設定していない)場合、以下の値が返ってきます。:

名前 説明
access_token アクセストークン (長さは40 文字, 16進で暗号化された sha1 ハッシュ)
expires_in 現時点でのトークンの有効期間。単位は秒
token_type "bearer"と設定されています。
state エンドポイントに対してstateパラメータを設定して送信していた場合、Ustream側から送り返されてきます。

response_typeパラメータに "token"と設定されてtoken_typeパラメータに"mac"と設定されていた場合、以下の値が返ってきます。:

名前 説明
access_token アクセストークン (長さは40 文字, 16進で暗号化された sha1 ハッシュ)。 Ustream映像配信用ライブラリではmacIdと呼ばれます。
expires_in 現時点でのトークンの有効期間。オフラインスコープが有効の場合は設定されません。
mac_key 秘密MAC(長さは40 文字, 16進で暗号化された sha1 ハッシュ)。 Ustream映像配信用ライブラリではmacSecretと呼ばれます。
created_at 作成された日時のUTC形式タイムスタンプ。 Ustream映像配信用ライブラリではmacIssueTimeと呼ばれます。
mac_algorithm "hmac-sha-1"と設定されています。
token_type "mac"と設定されています。
state エンドポイントに対してstateパラメータを設定して送信していた場合、Ustream側から送り返されてきます。


エラー時の動作:

認証に失敗した場合、HTTPリダイレクションは行われません: ユーザーは、正しいIDとパスワードを入力するまで認証ページにとどまることができます。 パスワードを忘れてしまった場合は、新規ユーザーとして登録したりパスワードをリセットしたりすることが可能です。

正しく認証できても、認証ページでユーザーが「Deny」のボタンを押した場合、ブラウザは以下のパラメータを埋め込まれたredirect_uriにリダイレクトされます:

名前 説明
error "access_denied"
state エンドポイントに対してstateパラメータを設定して送信していた場合、Ustream側から送り返されてきます。


トークンエンドポイント

URL https://www.ustream.tv/oauth2/token
サポートしている認証フロー 認証コードフロー
サポートしている HTTP メソッド POST


認証コードフローのトークン

クライアントソフトが認証コードを取得した時、 クライアントソフトが呼び出したエンドポイントのサーバ側コンポーネントはアクセストークンを返します。 以下のパラメータは必ず HTTP POSTのパラメータとして設定しなければなりません。

メモ:現在、トークンエンドポイントはBearer Tokensにのみ対応しています。

パラメータ タイプ 重要度 説明
grant_type string REQUIRED この場合は必ず"authorization_code"と設定してください。
client_id string REQUIRED 長さは40 文字の16進で暗号化された sha1 ハッシュ。Ustream側から提供される。
code string REQUIRED 認証エンドポイントから取得した認証コードです。
redirect_uri string REQUIRED The redirection URI used by the authorization Server to return the authorization response in the previous step.

上記のパラメータに加えて、クライアントを自分自身を証明する秘密情報(provided along with the Client key)を送らなければなりません。 認証は、HTTPのBasic認証を使って行われます。以下は HTTP ヘッダ例:

	
	Authorization: Basic bc345abc45d6789abcdef0123aef0126789def01
	
	


サーバからの応答:

トークンエンドポイントからのレスポンスはJSON形式になります。成功すると JSON形式の応答が返ってきます。 (ベアラートークンの場合):

名前 説明
access_token アクセストークン (長さは40 文字, 16進で暗号化された sha1 ハッシュ)。
expires_in 現時点でのトークンの有効期間。オフラインスコープが有効の場合は設定されません。
token_type "bearer"と設定されています。


オーナーの識別情報を使用するためのトークン

クライアントソフトがエンドポイントを呼び出すと、サーバ側コンポーネントはアクセストークンを返します。 このアクセストークンで、オーナーの識別情報(ユーザー名とパスワード)を使用することができます。 以下のパラメータは必ず HTTP POSTのパラメータとして設定しなければなりません。

パラメータ タイプ 重要度 説明
grant_type string REQUIRED この場合は必ず"password"と設定してください。
client_id string REQUIRED 長さは40 文字の16進で暗号化された sha1 ハッシュ。Ustream側から提供される。
client_secret string REQUIRED 長さは40 文字の16進で暗号化された sha1 ハッシュ。Ustream側から提供される。
username string REQUIRED Ustreamでのユーザー名
password string REQUIRED Ustream でのパスワード
device_name string OPTIONAL 端末名
token_type string OPTIONAL 必ず"bearer" か "mac"と設定してください。
scope string OPTIONAL オフラインスコープの場合は"offline"となり、映像配信者スコープの場合は"broadcaster"となり、 区切り文字にはスペースを使用します。

上記のパラメータに加えて、クライアントを自分自身を証明する秘密情報(provided along with the Client key)を送らなければなりません。 認証はHTTPのBasic認証を使って行われます。以下は HTTP ヘッダ例:

	
	Authorization: Basic bc345abc45d6789abcdef0123aef0126789def01
	
	


サーバからの応答:

名前 説明
access_token アクセストークン (長さは40 文字, 16進で暗号化された sha1 ハッシュ)。
expires_in 現時点でのトークンの有効期間。オフラインスコープが有効の場合は設定されません。
token_type "bearer"か "mac"と設定されています。
mac_key 秘密MAC(長さは40 文字, 16進で暗号化された sha1 ハッシュ)。 Ustream映像配信用ライブラリではmacSecretと呼ばれます。
created_at 作成された日時のUTC形式タイムスタンプ。 Ustream映像配信用ライブラリではmacIssueTimeと呼ばれます。
mac_algorithm "hmac-sha-1"と設定されています。


クライアント識別トークン

APIの中には、ユーザーのリソースにアクセスできないものがあります。これらのAPIはクライアントアプリ用に実装されているものだからです。予約管理機能がいい例でしょう。 これらはクライアントが自分自身を識別するために必要なものです。そのためにUstreamではクライアントを識別するためのOAuth2認証フローを実装し、あなたのアプリにクライアントソフト用のアクセストークンを渡します。 クライアントが通常のユーザーレベルのトークンを使っていた場合ユーザーリソースはそのアクセスを決して受け付けませんが、このクライアント識別トークンを使えば ユーザーリソースにアクセスすることができます。
以下のパラメータは必ず HTTP POSTのパラメータとして設定しなければなりません。

パラメータ タイプ 重要度 説明
grant_type string REQUIRED この場合は必ず"client_credentials"と設定してください。
client_id string REQUIRED 長さは40 文字のsha1 ハッシュ。Ustream側から提供される。
device_name string OPTIONAL 端末名
token_type string OPTIONAL 必ず"bearer" か "mac"と設定してください。
scope string OPTIONAL オフラインスコープの場合は"offline"となり、映像配信者スコープの場合は"broadcaster"となり、 区切り文字にはスペースを使用します。

上記のパラメータに加えて、クライアントを自分自身を証明する秘密情報(provided along with the Client key)を送らなければなりません。 認証はHTTPのBasic認証を使って行われます。以下は HTTP ヘッダ例:

Authorization: Basic bc345abc45d6789abcdef0123aef0126789def01


サーバからの応答:

名前 説明
access_token アクセストークン (長さは40 文字, 16進で暗号化された sha1 ハッシュ)。
expires_in 現時点でのトークンの有効期間。オフラインスコープが有効の場合は設定されません。
token_type "bearer"か "mac"と設定されています。
mac_key 秘密MAC(長さは40 文字, 16進で暗号化された sha1 ハッシュ)。 Ustream映像配信用ライブラリではmacSecretと呼ばれます。
created_at 作成された日時のUTC形式タイムスタンプ。 Ustream映像配信用ライブラリではmacIssueTimeと呼ばれます。
mac_algorithm "hmac-sha-1"と設定されています。


認証コード、パスワード、クライアント識別トークンでのエラー応答の動き:

エラーが発生した場合、トークンエンドポイントは以下形式のJSON型データを返します。:

{
	"error": "ERROR_VALUE"
}

また、エラーを示すHTTPステータスコードが送られます。これは発生している可能性のあるエラー内容です。:

エラー値 HTTPレスポンスコード エラー状態
invalid_request 400 Bad Request 必須パラメータが1つ以上抜けている。
unsupported_grant_type 501 Not implemented クライアントがサポートしていない許可タイプを要求している。現在は"authorization_code"のみサポートしており、 "client_credentials"と"refresh_token"と "password" はサポートしていません。
invalid_grant 400 Bad Request 設定されたauthorization_codeが存在しないか、期限切れとなっている。
invalid_client 400 Bad Request 指定クライアントが存在しないか、秘密情報が間違っているか、認証要求したクライアントとトークンを要求したクライアントが一致しません。
server_error 503 Server Error 何らかの理由で、このタイミングではサーバがリクエストを処理できなかった。時間を置いて再実行してください。


サンプル

認証コードフロー

1. クライアントはブラウザで認証エンドポイントを開きます。:

https://www.ustream.tv/oauth2/authorize
?response_type=code
&client_id=AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDD
&redirect_uri=http://example.com/get_access_token
&device_name=My%20Device
&scope=offline+broadcaster
&display=touch
&state=XYZ

2.ユーザーは自身のIDとパスワードを入力し、"Allow"ボタンをクリックします。ブラウザは以下のURLにリダイレクトされます。:

http://example.com/get_access_token?code=19d8dbb3ebac55f110c3b526e38bcfdfbf46d659&state=XYZ

3. The page handler at http://example.com/get_access_token retrieves the Access Token using the Token Endpoint:

POST /oauth2/token HTTP/1.1
Host: www.ustream.tv
Authorization: Basic xxxxxxxxxxyyyyyyyyyywwwwwwwwwwzzzzzzzzzz
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&client_id=AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDD
&code=19d8dbb3ebac55f110c3b526e38bcfdfbf46d659&redirect_uri=http://example.com/get_access_token

4.トークンエンドポイントからのレスポンスにアクセストークンが含まれています:

HTTP/1.1 200 OK
Cache-Control: no-store
Content-Type:application/json; charset=UTF-8
{"access_token":"ab345cdef123ef1267890abcdef04567890abcd1", "token_type":"bearer", "expires_in":86400}


暗示フローで、携帯に最適化された認証ページでMACトークンを取得する。

1.クライアントはブラウザで認証エンドポイントを開きます。:

https://www.ustream.tv/oauth2/authorize
?response_type=token
&token_type=mac
&client_id=AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDD
&redirect_uri=http://example.com/token
&device_name=My%20Device
&scope=offline+broadcaster
&display=touch
&state=XYZ
	

2/a.ユーザーは自身のIDとパスワードを入力し、"Allow"ボタンをクリックします。ブラウザは以下のURLにリダイレクトされます。:

http://example.com/token
?access_token=1a446888dfaa921e189479409d638d680dfdbf77
&token_type=mac
&mac_key=dfc337d39b0941650b67051a622885cb0eb67a51
&mac_algorithm=hmac-sha-1
&created_at=1310000546
&state=XYZ
	

2/b.認証後にユーザーが認証ページをキャンセルするかDenyボタンをクリックすると、ブラウザは以下のURLにリダイレクトされます。:

http://example.com/token?error=access_denied&state=XYZ


コマンドラインからAPIの動作確認をする(with curl)

アクセストークンの取得
https://www.ustream.tv/oauth2/authorize
?response_type=token
&client_id=057ce944b015ec9fdf546dfbbe1b7af4b19e8158
&redirect_uri=https://www.ustream.tv/oauth2/redirect
&device_name=MyDevice
&display=touch
&state=XYZ

ログイン後、ブラウザは 専用の URL (クライアントソフトによって定義されたURL)にリダイレクトされます。 アクセストークンはURL内に埋め込まれて表示されます。以下にある例に見られるように、リクエストではトークンを記載した認証HTTPヘッダを使うようにしてください。:
"Authorization: Bearer 3c2573673b782f6544405a22636f3d5d3b6f3950"



チャンネルの作成(POST)
$curl -i -X POST -H "Authorization: Bearer 3c2573673b782f6544405a22636f3d5d3b6f3950" -d "title=Whatever+Test+1234" https://api.ustream.tv/users/self/channels.json
HTTP/1.1 201 CREATED
Server: nginx/1.2.6
Date: Tue, 15 Jan 2013 13:08:06 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 123
Connection: keep-alive
Vary: Host
X-Powered-By: PHP/5.3.20-1~dotdeb.0
Cache-Control: no-store
Accept-Ranges: bytes
X-Varnish: 703443498
Age: 0
Via: 1.1 varnish
{"channel":{"id":"13091307","title":"Whatever Test 1234","url":"whatever-test-1234","tiny_url":"http://ustre.am/SVE7"}}
他の動画配信アプリケーションとの連携のため、streamkeyを取得する

Ustream以外の動画配信ソフト・動画配信アプライアンスを使用したいのであれば(Flash Live Media EncoderやWirecast、Tricasterなど)、 そのチャンネルへの動画配信が許可されていることを証明する、Ustreamに承認されたストリームキーが必要です。 Also you should get the ingest point where your device or application should connect.

以下の方法でstreamkeyにアクセスすることができます(it is usually the parameter "stream" in the configuration of these devices)。streamkeyを取得するためのエンドポイントでは、処理のためにOAuth2の認証キーが要求されます。 エンドポイントは https://api.ustream.tv/channels/CHANNEL_ID/authorizations/broadcasting.jsonです。

実行例
GET /channels/123456/authorizations/broadcasting.json
Host: api.ustream.tv
Authorization: Bearer 3c2573673b782f6544405a22636f3d5d3b6f3950
Content-Type: application/x-www-form-urlencoded

応答例

HTTP/1.1 200 OK
Cache-Control: no-store
{"streaming_key": "kqDlIyGb0H47g8SRSyKjyxAqPmiwTbw3"}


他の動画配信アプリケーションとの連携のため、channelkeyを取得する

Flash media live encoderを使用したいのであれば、 そのチャンネルへの動画配信が許可されていることを証明する、Ustreamに承認されたチャンネルキーが必要です。 Also you should get the ingest point where your device or application should connect.

以下の方法でchannelkeyにアクセスすることができます(it is usually the parameter "stream" in the configuration of these devices) 。channelkeyを取得するためのエンドポイントでは、 処理のためにOAuth2の認証キーが要求されます。エンドポイントは https://api.ustream.tv/channels/CHANNEL_ID/authorizations/broadcasting/channel_key.jsonです。

実行例

GET /channels/123456/authorizations/broadcasting/channel_key.json
Host: api.ustream.tv
Authorization: Bearer 3c2573673b782f6544405a22636f3d5d3b6f3950
Content-Type: application/x-www-form-urlencoded

応答例

HTTP/1.1 200 OK
Cache-Control: no-store
{"channel_key": "kqDlIyGb0H47g8SRSyKjyxAqPmiwTbw3"}