2017-08-10 12 views
0

GoogleカレンダーAPIに接続するWebサービスを作成しようとしています。私のアプリを許可しようとすると、私は必要な範囲でURLを生成しました。問題は、私が生成されたURLにクライアントをリダイレクトしようとすると、私は次のメッセージを405エラーを取得しています:クライアントをGoogle OAuthにリダイレクトしようとすると405エラーが発生する

プリフライトリクエストへの応答は、アクセス制御チェックに合格しない:いいえ 「アクセス制御を-Allow-Origin 'ヘッダは、要求された リソースに存在します。したがって、オリジン 'http://localhost:8080'は許可されません。 応答にHTTPステータスコード405がありました。

ほとんどの場合、私はこのガイドに従っています:https://developers.google.com/identity/protocols/OAuth2WebServer node.jsクライアントライブラリを使用しています。

私は理解しているように、Googleがクロスオリジンのリクエストを受け入れるようにサーバーを設定していないようですが、私が理解できないのは、リクエストを送信できない場合にユーザーを認証ページにリダイレクトする方法です私のドメイン。

ここに関連するコードです:

export function authorize(req, res, callback): any { 
    let auth = new googleAuth(); 
    let oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); 
    if (// Check if we have previously stored a token.) { 
    oauth2Client.credentials = //get token; 
    callback(oauth2Client); 
    } else { 
    //redirect to google authentication page 
    let authUrl = oauth2Client.generateAuthUrl({ 
     access_type: 'offline', 
     state: '/', 
     scope: SCOPES 
    }); 
    res.redirect(authUrl); 
    } 
} 
+1

Aは「メソッドが許可されていません」という意味で、この文脈では、サーバーはOPTIONS要求を、あなたがヒットしようとしている 'authUrl' URLにまったく許可しません。サーバーがクロスオリジン要求を受け入れるかどうかはまったく関係ありませんが、curlやpostmanなどのツールを使用してOPTIONS要求を 'authUrl' URLに送信して確認することができます戻ってください。私はあなたが405を得るつもりであると確信しています。 – sideshowbarker

+0

とにかく、そのサーバーがOPTIONS要求に405を与えている限り、フロントエンドJavaScriptコードからの応答に正常にアクセスする方法はありません。代わりにバックエンドコードから要求を行う必要があります。 OAuthベースのサービスの場合、フロントエンドのJavaScriptコードからアクセスできるようにXHRやFetch APIを使用することはできません。 – sideshowbarker

+0

@sideshowbarker OPTIONSリクエストは、私が意図的に行っているものではなく、ブラウザからのプリフライトリクエストです。あなたは正しいですが、私は郵便配達員を使って同じ問題を抱えていますが、405からOPTIONSへのリクエストは、私がCORSリクエストを作成しているのでナビゲートしなければならない問題です。サーバー側にリクエストすれば、ユーザーはどのように認証されますか?たとえば、Googleの例からのリンクでは、ログインしてその例のスコープへのアクセスを許可するように要求されています。私はまだユーザーにログイン/私のアプリケーションへのアクセスを許可する必要があります。 –

答えて

0

は、AJAXが300のステータスコードを受信したときに、ブラウザが自動的にクライアントの代わりに返された場所に別のGETリクエストを送信しますが判明します。私がCORSの問題を抱えていたとしても、リクエストがクライアントのために作られて以来、手動でhtmlページを手動でロードしなければならなかったでしょう。私が本当に望んでいるのは、ブラウザが認証uriにリクエストを行うことです。

この問題に対する私の解決策は、フロントエンドのリダイレクトを検出し、ブラウザに全く新しいGETリクエストを発行させることです。それでも誰かがもっと良い解決策を持っていれば、私はそれを聞いてみたいです。

関連する問題