正しい方法で物事を行っていない限り、私は特定の問題を抱えています。
クライアント (html サイト) と API (express + mongodb で構築) の 2 つの側面を持つアプリケーションがあります。API には安全にアクセスする必要があります。どちらも異なるドメインにあります。今のところ、私のサイトが domain.com にあり、API が api.com:3000 にあるとしましょう。
データを使用してユーザーを作成するときに、Github からアクセス トークンを取得するためにパスポートを追加したので、基本的に「Github でサインイン」できます。
私の現在のプロセスは次のとおりです。
1) クライアント (サイト) が API でポップアップを開く
window.open("http://api.com:3000/oauth")
2) エクスプレス サーバーは、パスポート プロセスを開始します。
app.get('/oauth', passport.authenticate('github'), function(req, res) {
});
戦略には、このコードを使用しました。
3) ポップアップを閉じる URL にコールバックをリダイレクトします (window.close() を使用した JavaScript):
app.get('/oauth/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res) {
res.redirect('/auth_close');
});
その時点で、すべて問題なく、API にログインしています。私の問題は、クライアントがaccessToken、ユーザー、またはユーザーIDについてまだ何も知らないため、データをクライアントに戻す方法です。
そこで、クライアント (ポップアップを開くサイト) から、さまざまなアプローチを試みました。
ポップアップから値を取得する: リダイレクトが原因で機能しません。ポップアップの JavaScript 情報を見失います
http://api.com:3000/currentなどのセッションで「現在のユーザー」を取得するために API を呼び出す もう 1 つの要求、理想的ではありませんが、これは機能します。しかし、まだ問題があります。
この /current url は、ブラウザーから到達した場合にユーザーを返します。これは、ブラウザーがヘッダー要求でエクスプレス セッション Cookie を送信するためです。
Cookie:connect.sid=s%3AmDrM5MRA34UuNZqiL%2BV7TMv6.Paw6O%2BtnxQRo0vYNKrher026CIAnNsHn4OJdptb8KqE
問題は、jquery などからこの要求を行う必要があることです。セッションが送信されないために失敗します。したがって、ユーザーは返されません。
app.get('/current', function() {
// PROBLEM HERE, req.user is undefined with ajax calls because of the session!
});
私はそれを機能させる方法を見つけましたが、クロスブラウザーのCORSの問題があるため、満足していません。表現するために追加しています:
res.header("Access-Control-Allow-Credentials", "true");
ここで説明されているように、jquery ajax 呼び出しに withCredentials フィールドを追加します。
ネイティブ XHR オブジェクトに設定する fieldName-fieldValue ペアのマップ。たとえば、必要に応じてクロスドメイン リクエストに対して withCredentials を true に設定するために使用できます。
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
ヘッダーのワイルドカードを失っているため、これにも満足していません: 、ここでAccess-Control-Allow-Origin
説明されているように、ドメインを指定する必要があります。
したがって、ここで取るべきアプローチがわかりません。必要なのは、クライアントが accessToken またはパスポート oauth プロセスから返されるユーザー ID のいずれかを取得することだけです。アイデアは、API への各呼び出しでそのトークンを使用して、呼び出しを検証することです。
どんな手掛かり?