このトピックでは、モバイルアプリケーションとデスクトップアプリケーションがOAuth 2.0を使用してドライブおよびフォトサービスにアクセスする方法について説明します。
1. 概要
モバイルアプリケーションとデスクトップアプリケーションはネイティブアプリケーションです。これらのアプリケーションにAppSecretなどの機密情報を保存することは安全ではありません。
AndroidまたはiOS用のモバイルアプリケーションは、URLスキームを使用して認証アプリケーションを起動できます。
macOS、Linux、またはWindows用のデスクトップアプリケーションは、ループバックIPアドレスまたはURLスキームを使用して認証アプリケーションを起動できます。
または、アプリケーションはWebViewを使用してWebアプリケーションに認証リクエストを送信することもできます。
(1) 仕組み
認証コードモード:モバイルアプリケーションまたはデスクトップアプリケーションの認証コードを使用したアクセスプロセスは、Webアプリケーションのアクセスプロセスと似ています。唯一の違いは、アクセストークンを取得するためにAppSecretを提供する必要がないことです。これは、Webサーバーが存在せず、モバイルアプリケーションまたはデスクトップアプリケーションにAppSecretを保存することは安全ではないためです。
(2) フローチャート
2. 準備
(1) ドメインの作成
ドライブおよびフォトサービスコンソールでドメインを作成します。ドメインが作成されると、https://{domainId}.api.aliyunpds.com
の形式の第4レベルAPIドメイン名が提供されます。
(2) ユーザーシステムログオン機能の有効化
ドライブおよびフォトサービスは、ログオン認証用にいくつかの一般的なユーザーシステムを提供しています。開発者は、ドライブおよびフォトサービスコンソールでユーザーシステムログオン機能を有効にできます。詳細については、PDSユーザーシステムを参照してください。
(3) ドライブおよびフォトサービスコンソールでOAuthクライアントとして使用するアプリケーションの作成
ネイティブアプリケーションを作成します。アプリケーションのスコープを指定します。スコープは同意ページに表示されます。アプリケーションが作成されると、アプリケーションのAppIdとAppSecretを取得できます。AppIdとAppSecretは、OAuth認証のClientIdとClientSecretとして使用されます。AppKeyとAppSecretは、認証と認可のための資格情報です。AppSecretは機密にしておく必要があります。
(4) リダイレクトURIの計画
AndroidまたはiOSアプリケーションに適用可能なカスタムURLスキームを使用する
アプリケーションを一意に識別するために、アプリケーションのURLスキームを登録します。スキームの形式は次のとおりです:<スキームドメイン名>://<パス>?<パラメータ>=<値>
。
デスクトップアプリケーションに適用可能なカスタムループバックIPアドレスを使用する
ポートでリッスンするローカルWebサービスを開始できます。例:http://127.0.0.1:3000/callback
またはhttp://[::1]:3000
。
3. OAuth 2.0アクセストークンの取得
(1) Authorize操作の呼び出し
APIリクエスト構文:
GET /v2/oauth/authorize?client_id=<appId>&redirect_uri=<redirect_uri>&scope=<scope>&login_type=<login_type>&state=[state]&prompt=[prompt] HTTP/1.1
Host: {domainId}.api.aliyunpds.com
パラメータ | 必須 | 説明 |
client_id | はい | アプリケーションのAppId。AppIdがない場合は、ドライブおよびフォトサービスコンソールでアプリケーションを作成してAppIdを取得します。 |
redirect_uri | はい | 認証プロセスが完了した後、ドライブおよびフォトサービス認証サーバーがユーザーをリダイレクトするURI。このパラメータを、アプリケーションによって提供されるURLスキームまたはループバックIPアドレスに設定します。例: |
scope | はい | アプリケーションに必要な権限を指定するスコープ。スコープは同意ページに表示されます。詳細については、Authorizeを参照してください。 |
response_type | はい | レスポンスのタイプ。値を |
state | いいえ(推奨) | このパラメータが指定されている場合、ドライブおよびフォトサービス認証サーバーは、リプレイ攻撃を防ぐために、この値をリダイレクトURIでそのまま返します。例: |
login_type | はい | ログオン方法。有効な値: |
hide_consent | いいえ | ユーザーが初めてログオンする場合に同意ページを表示するかどうかを指定します。有効な値: |
lang | いいえ | ページが表示される言語。有効な値: |
ユーザーがこのリクエストを送信すると、ドライブおよびフォトサービス認証サーバーはユーザーにログオンするように指示します。ユーザーが初めてログオンし、hide_consent
パラメータをtrueに設定していない場合、ドライブおよびフォトサービス認証サーバーはユーザーを同意ページにリダイレクトします。それ以外の場合、ドライブおよびフォトサービス認証サーバーは、redirect_uri
パラメータで指定されたリダイレクトURIにユーザーをリダイレクトします。例:pdshz001://callback/?code=xxxx&state=abc
。
(2) 同意ページでアプリケーションに権限を付与する
同意ページで、ユーザーは指定された権限をアプリケーションに付与するかどうかを決定できます。ユーザーが権限の付与を拒否した場合、プロセスは終了します。ユーザーが権限の付与に同意した場合、ドライブおよびフォトサービスは、redirect_uri
パラメータで指定されたリダイレクトURIにユーザーをリダイレクトします。例:pdshz001://callback/?code=xxxx&state=abc
。
(3) 認証コードをアクセストークンと交換する
認証コードを取得した後、Token操作を呼び出して認証コードをアクセストークンと交換できます。
APIリクエスト構文:
POST /v2/oauth/token HTTP/1.1
Host: {domainId}.api.aliyunpds.com
Content-Type: application/x-www-form-urlencoded
code=xxx\
&client_id=your_app_id\
&redirect_uri=pdshz001://callback\
&grant_type=authorization_code
パラメータ | 必須 | 説明 |
code | はい | ワンタイム認証コード。 |
client_id | はい | アプリケーションのAppId。 |
redirect_uri | はい | アプリケーションに設定したリダイレクトURI。 |
grant_type | はい | OAuth 2.0仕様に基づいて、値をauthorization_codeに設定します。 |
レスポンスパラメータ
パラメータ | 場所 | タイプ | 必須 | 説明 |
access_token | body | STRING | はい | 生成されたアクセストークン。2時間有効です。 |
expires_time | body | STRING | はい | アクセストークンの有効期限。 |
expire_in | body | STRING | はい | アクセストークンの残りの有効期間。単位:秒。 |
token_type | body | STRING | はい | 値はBearerに固定されています。 |
成功レスポンスの例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"Aiasd76YSo23...LSdyssd2",
"expires_time":"2019-11-11T10:10:10.009Z",
"expire_in": 7200,
"token_type":"Bearer",
"refresh_token":"LSLKdklksd...li3ew6"
}
このリクエストへのレスポンスは、認証コードを使用してアクセストークンを取得した場合に返されるレスポンスと同じですが、refresh_tokenパラメータは含まれていません。
レスポンス内のオプションパラメータは無視してください。
4. ドライブおよびフォトサービスAPI操作の呼び出し
アプリケーションは、アクセストークンを使用してドライブおよびフォトサービスAPI操作を呼び出すことができます。アクセストークンは、APIリクエストのAuthorizationヘッダーに含める必要があります。
詳細については、呼び出し方法を参照してください。
5. アクセストークンの更新
(1) APIリクエスト構文
POST /v2/oauth/token HTTP/1.1
Host: {domainId}.api.aliyunpds.com
Content-Type: application/x-www-form-urlencoded
refresh_token=xxx\
&client_id=xxx\
&grant_type=refresh_token
リクエストパラメータ
パラメータ | 必須 | 説明 |
refresh_token | はい | 認証コードをアクセストークンと交換したときに返される更新トークン。 |
client_id | はい | アプリケーションのAppId。 |
grant_type | はい | 付与方法のタイプ。OAuth 2.0仕様に基づいて、値をrefresh_tokenに設定します。 |
client_secret | いいえ | アプリケーションのAppSecret。AppSecretは、アプリケーションを認証するために使用されます。 |
(2) レスポンス
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"xxxxxxxxx",
"expires_in":3920,
"expire_time":"2019-11-11T10:10:10.009Z",
"token_type":"Bearer"
}
レスポンスパラメータ
アクセストークンの更新リクエストへのレスポンスの構造は、認証コードをアクセストークンと交換するリクエストへのレスポンスと同じです。