Appleサインイン、authorizeメソッドが初めて名前を返す

Aug 20 2020

Webアプリ(旧式のASP.NET、ただし問題ではありません。質問は単純なHTML / JS POCとして扱うことができます)にAppleサインインを実装し、Appleエンドポイントでメソッドauthorizeを呼び出します。

https://appleid.apple.com/auth/authorize?client_id=...&redirect_uri=...&response_type=code%20id_token&state=...&response_mode=form_post&scope=name%20email

ユーザーの名前と名前を取得したい。メソッドは次のようなものを返します:{

   "state": "xxx",
   "code": "yyy",
   "id_token": "zzz",
   "user": {
        "name": {
            "firstName":"John",
            "lastName":"Doe"
        },
        "email":"[email protected]"
    }
}

id_tokenはユーザーのアップルIDとメールアドレスで構成されるJWTであり、名前や名前に関するデータはありません。

ご覧のとおり、userプロパティから名前と名前を取得できます。それが私に知られている唯一の方法です。

問題は、Appleがこのデータを最初に要求したときにのみ返すことです。これはバグではなく、機能です。https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple :

重要

Appleは、ユーザーがアプリを初めて承認したときにのみユーザーオブジェクトを返します。アプリからこの情報を永続化します。後続の承認リクエストには、ユーザーオブジェクトは含まれません。

したがって、ワークフローの後半でこのデータを保存し、データベースに保存します。

今私の問題/質問:

ユーザーが自分のアカウントを削除すると、dbからすべてのデータを削除します(契約、法律などのために削除する必要があります)。

ユーザーがAppleサインインを介して再度登録すると、Appleエンドポイントにpingを実行すると、ユーザーデータ(名前と名前を含む)が取得されなくなります(上記のAppleポリシーのため)。

それを取得するにはどうすればよいですか?

回答

3 AnkitMishra Aug 28 2020 at 09:57

私はアップルのサインインバックエンド部分を行っていますが、同様の問題に直面しました。

IOS13以降の場合

  • SDKは、最初の承認リクエストにアップルユーザーのuuid、電子メール、および名前を提供します。
  • この一意のapple_user_uuidをDBのプロファイルの詳細にマッピングしています。(リクエストが失敗した場合は、これをキューに入れるようにバックエンドに依頼できます。アプリは、バックエンドの呼び出しが成功するまでこれをキャッシュに保持する必要があります)。

13未満のAndroid / WEBフロー/ IOSの場合

  • アップルのコールバックで初めて、ワンタイムコード(5分の有効期限)で名前が送信されます。

  • トークンAPIを呼び出すときにこのコードを使用すると、id_tokenJWTが提供されます。

  • トークンでは、件名はapple_user_uuidです。

  • 同じテーブルに永続化します。

したがって、バックエンドでは、常にemail、firstName、lastNameにapple_user_uuidのタグが付けられます。これは、AppleIDに対して一定のままです。

また、ユーザーがアカウントを削除した場合は、このマッピングを削除しないでください。アップルが修正を提供するまで。