1

I'm using facebook authentication on my site, with the "Login with Facebook" button in my nav menu on every page. Therefore the user should be able to login via facebook and be returned to the page they were on with one click. Facebook provides the return_uri parameter, which is set to /login/facebook on my site and it handles all of the authentication against the facebook API. However, once I am done with this logic and I log the user in, I need to know what page they were on originally so I can redirect them.

I've tried passing my return_uri parameter as:

http://example.com/login/facebook?local_redir=http://example.com/users/original/page

(with everything question mark and after encoded properly of course) so when I get the response back I know what their original page was. This fails when I try to get the access token. I basically need a way to have a "pass-through" parameter to facebook, but am coming up short here.

4

2 に答える 2

0

私はまったく同じ問題を抱えていました。

「CURLOPT_SSL_VERIFYPEER と CURLOPT_SSL_VERIFYHOST を変更し、trustForwarded を true に設定し、allowSignedRequest を false に設定し、.....」をすべて試しました。

どれもうまくいきませんでした。

結論 - 認証 URL を構築するために Facebook に渡していた return_uri のドメイン名には、大文字と小文字が含まれていました。認証が完了すると、facebook はブラウザーをその上下のドメイン名に送り返しましたが、fb コード自体では、現在の URL を作成して return_uri パラメーターと一致することを確認するときに、$ のような組み込みの php 配列を使用します。 _SESSION、これは小文字バージョンのみを提供するため、return_uri は実際には現在の URL と一致しません。

解決策 - ドメイン名がある場合は、小文字に設定してください。

于 2014-03-29T18:07:56.737 に答える
0

OK、うまくいく解決策を見つけました。どうやら Facebook は GET パラメータや URL 内に埋め込まれた URL を (適切にエンコードされていたとしても) 好まないようです。コメントからのCBroeの提案を組み合わせ、さらにURLをbase 64文字列に変換すると、うまくいきました:

string returnUrl = Convert.ToBase64String(
                            System.Text.Encoding.ASCII.GetBytes(
                                HttpContext.Current.Request.Url.ToString()
                          ));

...次に、return_uri パラメータを次のように設定します。

HttpUtility.UrlEncode("http://example.com/login/facebook/local_redir/" + returnUrl);

コントローラが Facebook から返されたリクエストを受け取ると、local_redirect に続く URL をデコードするだけです。

string decodedRedirectUrl = System.Text.Encoding.ASCII.GetString(
                                        Convert.FromBase64String(
                                            local_redir
                                      ));
于 2013-05-26T04:16:05.760 に答える