Appleでサインイン

問題1と2は、Apple の意図的な実装選択に起因しています。したがって、これは技術的なインシデントとはみなされず、回避策を講じることができます。問題3は omniauth-apple gem にあるため、修正可能です。

Apple に必要なのは、以降の認証フローで名前とメールアドレスを含めることです。残念ながら、Apple はこの動作を認めており、「仕様通りである」と述べています https://forums.developer.apple.com/thread/121496

これは正しく動作しており、ユーザー情報は初期のユーザー登録時のみ ASAuthorizationAppleIDCredential 経由で送信されます。同じアカウントを使用して以降アプリにサインインする際は、ユーザー情報は共有されず、ASAuthorizationAppleIDCredential にはユーザー識別子のみが返されます。サーバー上でアカウントが正常に作成されたことを確認するまで、ユーザー情報を含む初期の ASAuthorizationAppleIDCredential を安全にキャッシュしておくことを推奨します。

ただ気になったのですが、ウェブサイトで「Apple でサインイン」を採用している事例は他にありますか?私が知る限り、ネイティブアプリでのみ採用されているように思えます :thinking:

「いいね!」 3

この機能は、当社のiOSアプリがDiscourseのWebサイトにリンクしており、他の機能にはログイン要件がないという点で、非常に理にかなっていると思います。
ユーザーにとって、この方法でのログインは非常に便利です。多くのユーザーはすでにデバイスにログインしており、アプリ内購入に使用されるApple Payも同じアカウントを使用しているためです。

個人的な意見ですが、それでもAppleのDTS(Developer Technical Support)に連絡し、回避策について相談したり、この問題が実際に支障をきたしているというフィードバックを伝えることは意味があると思います。(残念ながら、私自身はこの件について十分に知識がないため、彼らと直接話すことはできません。)

GoogleやFacebookなどに比べるとまだ普及度は低いですが、いくつかのサイトで見かけました。例えばebay.comwordpress.com、kayak.comなどです。

「いいね!」 3

ただし、彼らは異なる API を使用している可能性があります。追加できる JS スクリプトは存在しますが、これは Discourse のより汎用的な OAuth システムと統合されないと思われます:

Kayak.com を例に挙げてみましょう。

ブラウザのインスペクタで少し調べてみると、以下のようなものが見つかります:

image

「いいね!」 1

はい、彼らは Apple の JavaScript ライブラリを使用しています。ただし、裏側では同じ「OAuth」(厳密には OAuth ではありません)API が使用されています。

Ebay はユーザー情報を取得しようとしてさえいません。Apple でサインインすると、メールアドレスの入力が求められます。

Kayak や Wordpress は、Apple の推奨に従って、最初の認証試行からユーザー情報をキャッシュしているのではないかと推測します。

おそらく私たちもこのアプローチを取る必要があるでしょうが、これは特に堅牢ではありません(例:最初の試行中にネットワーク接続が中断される場合、Discourse がバックアップから復元される場合、ユーザーが Apple のメールアドレスを変更する場合など)。また、私見ですが、プライバシーの観点からはやや劣ります(まだサインアップしていないユーザーのメールを保存する必要があるため)!

「いいね!」 6

最新のAppleのiOS変更により、これで実現可能になったと思いますよね?

「いいね!」 3

最近、Appleでサインインに関連する変更はありましたか?

現状のままでも動作するようにすることは可能です。ただし、これらの課題を回避するために数日かかります(これらの課題を回避する)。それでも、最初のログイン時のみメールアドレスと名前を受け取るという制限は残ったままになります。

「いいね!」 5

少し改善されたと思いますが、具体的な変更点をすぐに見つけることはできません。

メールが一度しか届かないのは大きな問題ではないでしょうか?Apple ID のメールアドレスを変更した場合にどうなるか、テストする必要があると思います。

「いいね!」 3

同じ UID は引き続き受け取れますが、新しいメールアドレスは受け取れません。ユーザーは Discourse 上で手動で更新する必要があります。

「いいね!」 3

これは再確認すべきだと思いますが、正直に言って、この実装を阻むほどの大問題にはならないでしょう。

iDevice でのサインインフロー、特に Apple サインインからの流れは素晴らしく、さらに Face ID による 2 段階認証も利用できます。

「いいね!」 5

:+1: プラグインを最新の状態に整えてテストできるようにリストに追加します。問題なければ、コア機能へ移行することも比較的簡単です。

「いいね!」 13

リポジトリはデビッドに引き継ぎ、Discourse へ移動しました :slight_smile:

この件を引き受けていただき、ありがとうございます。

「いいね!」 11

このトピックを 2〜3 回読みましたが、提供された JWT トークンからメールアドレスを取得しようとしたかどうかは覚えていません。

ネイティブコードでは以下のように実装しています。Web API でも同様にできるかどうかわかりません。

初回ログインでは、ASAuthorizationAppleIDCredential.email から直接メールアドレスを取得できます。
2 回目以降のログインでは、JWT データをデコードして email フィールドを取得することでメールアドレスが取得可能です。

これで機能を実装できるでしょうか?
提供されるメールアドレスは、ユーザーが選択した個人用のものであるか、ランダムなもののどちらかになります。

はい、その通りです。

私の経験ではそうではありません。最後に確認した際、JWT には以降のログイン時にメールアドレスが含まれていませんでした。

いずれにせよ、私たちは近い将来これを機能させる予定ですので、準備ができ次第このトピックを更新します :slight_smile:

「いいね!」 4

ネイティブ環境では、JWT の email プロパティを使うだけで動作していました。

もしウェブ側でも同様に更新されない場合、唯一の解決策はダミーのメール(自動確認済み)を自動生成し、ユーザーが後から必要に応じて変更できるようにすることかもしれません。

これは Apple が提供する ID に依存することになりますが、それほど悪い解決策ではありません。ただ、少し匂いがしますね :slight_smile:

「いいね!」 4

彼らが何かを改善した可能性は十分にありますね。念のため、もう一度確認しておきます :+1:

「いいね!」 6

これが機能させることは可能だと確信しています。問題となるのは以下の点です:

  • あなたの Apple ID のメールアドレスが jane.champion@somewhere.com である
  • Apple を通じて Discourse に登録する
  • Apple ID のメールアドレスを jane.row@somewhere.com に変更する
  • Discourse にサインインする……すると、私たちはまだあなたを jane.champion@somewhere.com と認識している
  • Discourse 内のメール通知は、今後永久に配信失敗(bounce)し続ける

Apple ID のメールアドレスが変更された際にどのようなプロセスが適用されているのか、またそれに対して私たちがどう対応できるのか(もし可能なら)、現時点では不明です。

私の判断では、この端境ケース(エッジケース)はそのまま受け入れ、少なくともユーザーはこのようなケースに備えて Discourse 内でメールアドレスを変更できる選択肢を持つべきだと考えます。

「いいね!」 3

今日はテストを行いましたが、良いニュースとして、Apple が問題を修正したようです :smiley: すべての認証でメールアドレスが表示されています。

まだ解決すべきいくつかの問題は残っていますが、今週中に公開できることを願っています。

「いいね!」 13

これは間違いなく Discourse に同梱する候補です。次のメジャーリリースに向けて、コードをコアに統合するか、少なくともプラグインをバンドルすることを目指すべきです(もちろん、来週のリリースではありませんが :))。

「いいね!」 13

はい、後でプラグインからコアへ移行させることも、ほとんど手間をかけずにできます。ただ一つ問題があるとすれば、Google や Facebook などに比べると、設定が非常に複雑だということです。

Apple の開発者アカウント(有料?)が必要で、ドメインの検証や証明書など、さまざまな設定を行う必要があります。しかし、優れた手順書(howto)があれば、確実に実現可能です。

「いいね!」 13