iOSでLogin with Amazon SDKを使用する

以下の手順に従って、Login with Amazon SDK for iOSを使用して対象デバイスにLogin with Amazon(LWA)の許可コードを渡します。その後、対象デバイスはこの許可コードを使用して、DRSの呼び出しに必要なrefreshaccess token を取得できます。サンプルコード全文は、Amazon Dash GitHubリポジトリで入手できます。

LWAのバージョンに関する注意

このドキュメントでは、LWAバージョン3.0.1を使用しています。LWAのバージョンは、viewDidLoadメソッドに次のコード行を追加することで確認できます。

NSLog(@"LWA version: %@", [AMZNLWASDKInfo sdkVersion]);

出力は次のようになります。

2017-02-09 18:19:53.680040 test[1805:822020] LWA version: 3.0.1

iOSで許可コードを取得してDRSを呼び出す

  1. Login with AmazonのGetting Started for Androidに移動し、手順1~5を実行します。
ティザーページ

上記の手順5において、"Login with Amazon"ボタンの追加方法が記載されています。ボタンを追加するだけではなく、ティザーページのガイドラインに基づいてページをデザインしてください。
  1. 新しいAPIキーをセキュリティプロファイルコンソールから取得します。セキュリティプロファイルがない場合は、LWAセキュリティプロファイルの作成ガイドの手順に従って作成してください。
  2. [Manage] ドロップダウンメニューで、[iOS Settings] を選択します。

  3. [Manage] ドロップダウンメニューで、[iOS Settings] を選択します。
  4. APIキー名バンドルIDを指定します。
  5. [Key] 列の [Show] をクリックすると、APIキーが表示されます。

  6. 新しいAPIキーをアプリケーションのInfo.plistファイルにコピーします。

  7. 次の#import文をソースファイルに追加して、Login with Amazon APIをインポートします。

     #import <LoginWithAmazon/LoginWithAmazon.h>
    
  8. ログインを実行する次の関数を追加します。

     - (void)login
     {
         AMZNAuthorizationManager* manager = [AMZNAuthorizationManager sharedManager];
         AMZNAuthorizeRequest* request = [[AMZNAuthorizeRequest alloc] init];
         request.interactiveStrategy = AMZNInteractiveStrategyAuto;
         NSMutableArray* scopeObjectArray = [NSMutableArray array];
         NSString* requestScopes = @"dash:replenish";
         NSMutableDictionary* options = NSMutableDictionary.new;
         //YOUR_DEVICE_SERIAL_NUMBER – DRSサービスと関連付けるデバイスのシリアル番号。英数字[A-Za-z0-9]のみ使用可能で、最大文字長は50文字です。
         options[@"serial"] = @"DEVICE_SERIAL_NUMBER";
         //デバイスのモデル名を設定します。セルフサービスポータルの「Device Model ID」が該当します。
         options[@"device_model"] = @"DEVICE_MODEL_NAME";
         // まだ認定されていないマーケットプレイスをこの登録で許可するかどうかを設定します。
         // リリース前のテストでのみ使用します。リリース後の実稼働アプリでは、このフラグを設定しないでください。
         // SHOULD_INCLUDE_NON_LIVE は「true」または「false」である必要があり、まだAmazonによって認定されていないデバイスの機能を使用して登録を進めることを許可します。You can use this parameter to test your system while awaiting Amazon certification.
         options[@"should_include_non_live"] = @"SHOULD_INCLUDE_NON_LIVE";
    
         // IS_THIS_A_TEST_DEVICE – これがテストデバイスであるかどうかを示すフラグ。`is_test_device`フラグをtrueに設定しないとデバイスをテストすることができませんが、実稼働のデバイスはfalseに設定する必要があります。テストデバイスでは実際の注文を行うことができません。
         // IS_THIS_A_TEST_DEVICE は「true」または「false」である必要がある
         options[@"is_test_device"] = @"IS_THIS_A_TEST_DEVICE";
    
         id<AMZNScope> drsScope = [AMZNScopeFactory scopeWithName:requestScopes data:options];
         [scopeObjectArray addObject:drsScope];
         request.scopes = scopeObjectArray;
         request.grantType = AMZNAuthorizationGrantTypeCode;
         // コードチャレンジを設定します。
         request.codeChallenge = @"YOUR_CODE_CHALLENGE";
         // コードチャレンジのメソッドを「plain」または「S256」に設定します。
         request.codeChallengeMethod = @"YOUR_CODE_CHALLENGE_METHOD";
         [manager authorize:request withHandler:[self requestLoginHandler]];
     }
    
     - (AMZNAuthorizationRequestHandler)requestLoginHandler
     {
         AMZNAuthorizationRequestHandler requestHandler = ^(AMZNAuthorizeResult* result, BOOL userDidCancel, NSError* error) {
             if (error) {
                 NSString* errorMessage = error.userInfo[@"AMZNLWAErrorNonLocalizedDescription"];
                 NSLog(@"Error:%@", errorMessage);
                 // ログインエラーの処理
             }
             else if (userDidCancel) {
                 // ユーザーによるキャンセルの処理
             }
             else {
                 // 認証に成功しました。ユーザープロファイルデータを取得します。
                 NSString* authCode = result.authorizationCode;
                 NSString* clientId = result.clientId;
                 NSString* redirectUri = result.redirectUri;
                 NSLog(@"\n code = %@ \n client ID = %@ \n redirect URI = %@", authCode, clientId, redirectUri);
                 // アクセストークンと更新トークンのリクエスト
             }
         };
         return [requestHandler copy]
     }
    

    YOUR_CODE_CHALLENGEYOUR_CODE_CHALLENGE_METHODの詳細については、前提条件のセクションを参照してください。

    これでPOSTリクエストを実行し、アクセストークンと更新トークンを取得するために必要な準備が完了しました。次の手順では、この呼び出しを行うプロセスについて詳しく説明します。この呼び出しは、お使いのモバイルアプリケーションやDRSデバイスから行うことができます。(このドキュメントは、DRSデバイスで呼び出しを行うことを想定しています。)

  9. 許可コード、クライアントID、リダイレクトURIをSSLを使用して対象デバイスに安全に転送します。

  10. 対象デバイスが許可コード、クライアントID、リダイレクトURIを受け取ると、そのデバイスはLogin with Amazonを呼び出してaccess tokenrefresh token の許可コードを交換できます。

許可コードを用いたリフレッシュトークンとアクセストークンの取得

呼び出しを行うとき、デバイスはPOSTリクエストをhttps://api.amazon.com/auth/O2/tokenに送信し、次のパラメーターを渡す必要があります。

HTTP Headerパラメータ

  • Content-Type:application/x-www-form-urlencoded

HTTP Bodyパラメータ

  • grant_type:authorization_code
  • code:iOSアプリから取得した許可コードの文字列。
  • redirect_uri:iOSアプリから取得したリダイレクトURIの文字列。
  • client_id:iOSアプリから取得したクライアントIDの文字列。
  • code_verifier:デバイスによって最初に生成されたコードベリファイアの文字列。

サンプルリクエスト:

 POST /auth/o2/token HTTP/1.1
 Host:api.amazon.com
 Content-Type:application/x-www-form-urlencoded
 Cache-Control:no-cache
 code=YOUR-AUTHORIZATION-CODE&client_id=YOUR-CLIENT-ID&redirect_uri=YOUR-REDIRECT-URI&code_verifier=YOUR-CODE-VERIFIER&grant_type=authorization_code
 curl –X POST –d 'code=YOUR-AUTHORIZATION-CODE&client_id=YOUR-CLIENT-ID&redirect_uri=YOUR-REDIRECT-URI&code_verifier=YOUR-CODE-VERIFIER&grant_type=authorization_code' https://api.amazon.com/auth/O2/token

レスポンスは下記の値を含みます:

  • access_token:アクセストークン文字列
  • refresh_token:リフレッシュトークン文字列
  • token_type:トークンタイプ文字列
  • expires_in:アクセストークンの有効時間(秒)

サンプルレスポンス:

 HTTP/1.1 200 OK

 {
    "access_token": "Atza|IQEBLjAsAhRBejiZKPfn5HO2562GBt26qt23EA...",
    "expires_in": 3600,
    "refresh_token": "Atzr|IQEBLzAtAhUAibmh-1N0EsdqwqwdqdasdvferrE...",
    "token_type": "bearer"
 }

新規リフレッシュトークン・アクセストークンのリクエスト

アクセストークン は1時間有効です。アクセストークンが無効になった、あるいは無効になりそうな場合、リフレッシュトークン を用いて、新たなアクセストークンを取得できます。

  • 次のパラメータを用いて、POSTリクエストをhttps://api.amazon.com/auth/o2/tokenに対して行います。

HTTP Headerパラメータ

  • Content-Type:application/x-www-form-urlencoded

HTTP Bodyパラメータ

  • grant_type:refresh_token
  • refresh_token:新規アクセストークンをリクエストするためのリフレッシュトークン。
  • client_id:iOSアプリから取得するクライアントID文字列。
  • client_secret:セキュリティプロファイルのクライアントシークレット。この情報はLogin With Amazonで確認してください。

サンプルリクエスト

POST /auth/o2/token HTTP/1.1
Host: api.amazon.com
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
grant_type=refresh_token&refresh_token=Atzr|CIQEBLzAtAhUAibmh-1N0E&client_id=amzn1.application-oa2-
client.b91a...&client_secret=6963038c1c2063c33ab9eedc...

サンプルレスポンス

HTTP/1.1 200 OK
{
   "access_token": "Atza|IQEBLjAsAhQ3yD47Jkj09BfU_qgNk4...",
   "expires_in": 3600,
   "refresh_token": "Atzr|IQEBLzAtAhUAibmh-1N0EVztZJofMx...",
   "token_type": "bearer"
}

次のステップ

次に、他のアプリでのLwAの実装について説明します。

作成したいアプリ ドキュメント
ネイティブAndroidアプリ AndroidでLogin with Amazon SDKを使用する
ネイティブiOSアプリ iOSでLogin with Amazon SDKを使用する
Webアプリ、およびCordovaのようなハイブリッドアプリ LwA Web APIの使用

すでにLwAを実装している場合、APIの概要にお進みいただけます。