Discourse にユーザーがログインした後、外部 URL を呼び出してリモートサイトへのログインを試みています。必要なのは、リモートサイト上の URL にリダイレクトし、そこでログインを完了させた後に Discourse へ戻すことです。しかし、そうするとブラウザが CORS のためリダイレクトを拒否します:
Access to XMLHttpRequest at 'https://SITE/api/sso/v2/sso/jwt?' (redirected from 'https://testing.literatehosting.com/session') from origin 'https://testing.literatehosting.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
アプリの開発者たちは、私がリダイレクトのやり方を間違えている(例えば、ajax 呼び出しを使っているなど)と言っていますが、これは例えば こちら で言及されているコミットの内容と全く同じように見えます。
(またしても)行き詰まっています。
自分が単に愚かなのか、それとも相手側が Access-Control-Allow-Origin ヘッダーを送信する必要があるのか判断できません(もしそうなら、彼らのクライアントの誰もこれで動いているはずがないことになりますが、それはあまりに非現実的です)。
以下が私のコードです:
after_initialize do
class ::SessionController
def login(user)
puts "\n\n\n\LOGIN happening!\n\n\n\n"
session.delete(ACTIVATE_USER_KEY)
log_on_user(user)
if payload = cookies.delete(:sso_payload)
sso_provider(payload)
else
if true # plugin is enabled and has api key and url
sign_into_thinkific(user)
else
render_serialized(user, UserSerializer)
end
end
end
def sign_into_thinkific(user)
# do stuff to generate payload
redirect_to thinkific_sso_url(payload) # also tried redirect_to
generate_url(thinkific_sso_url(payload))
end
def generate_url(url, params = {})
puts "\n\n\nGenerate URL: #{url}\n\n\n"
uri = URI(url)
uri.query = params.to_query
uri.to_s
end
def thinkific_sso_url(payload)
current_url="https://#{GlobalSetting.hostname}/"
url = "https://#{SiteSetting.thinkific_site_url}/api/sso/v2/sso/jwt?jwt=#{payload}"
url += "&return_to=#{URI.escape(current_url)}"
url
end
end
end
追記:開発者たちは、私が使っているのと同じ redirect_to を使用した Rails アプリを共有してくれました。彼らはそれが動作すると主張しています。Discourse には何か特別な仕組みがあり、Ember の内部にあるため redirect_to の挙動が異なるのでしょうか?
