OmniAuth를 통해 매개 변수 전달
콜백 작업에 몇 가지 매개 변수를 전달해야합니다. 소스 코드로 판단하면 OmniAuth는 콜백 URL에 쿼리 문자열을 추가해야하지만 이상하게도 그렇지 않습니다. 내가 열 때
/auth/facebook?from=partner
... 페이스 북에 리디렉션, return_url
그냥
/auth/facebook/callback
... 매개 변수없이.
위의 모든 답변으로 어려움을 겪은 후 기본적으로 매개 변수를 표시하지 않는 Facebook 과 관련하여 무엇을 해야할지 알아 냈습니다 request.env["omniauth.auth"]
.
따라서-콜백에 쿼리 문자열을 사용하는 경우 다음과 유사합니다.
"/auth/facebook?website_id=#{@website.id}"
해당 website_id 매개 변수를 얻는 유일한 방법은 request.env["omniauth.params"]
. 참고 : omniauth.auth가 아닌 omniauth.params를 사용하는지 확인하십시오 .
그런 다음이를 테스트하기 위해 컨트롤러 작업 내에서 검사 할 수 있습니다 (RAISE 라인에 유의하십시오 ...).
def create
raise request.env["omniauth.params"].to_yaml
# the rest of your create action code...
end
거기에 매개 변수가 표시되어야합니다. 큰. 이제 컨트롤러로 돌아가서 해당 RAISE 라인을 제거하십시오. 그런 다음 컨트롤러 작업에서 다음과 같이 매개 변수에 액세스 할 수 있습니다.
params = request.env["omniauth.params"]
website_id = params["website_id"]
참고 : params [ "website_id"]에서 기호가 아닌 따옴표를 사용해야합니다.
쿠키가 작동한다고 생각하지만 https://github.com/mkdynamic/omniauth-facebook에 설명 된대로 상태 변수를 사용할 수있을 때 모든 작업을 수행하는 이유
이것이 내가 사용한 방법입니다.
URL을 만들 때 쿼리 문자열에 상태를 추가하기 만하면 콜백 URL에서도 사용할 수 있습니다.
user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>
이제 콜백 URL은
http://localhost:3000/users/auth/facebook/callback?state=123&code=ReallyLongCode#_=_
이제 콜백 핸들러에서 상태를 처리 할 수 있습니다.
다음 :params
과 같이 옵션을 사용할 수 있습니다 .
omniauth_authorize_path(:user, :facebook, var: 'value', var2: 'value2' )
나중에 콜백에서 액세스 request.env['omniauth.params']
하여 해시를 얻을 수 있습니다 ! :)
( 이 답변 에서 복사 )
당신이 동적으로 URL (의 파트너 이름을 포함하도록 콜백을 설정하고 싶지 하지 A의 경우, url 매개 변수) 인증 거래 당 파트너가 포함 된에 따라 기준. 이는 각 인증 요청에 대해 콜백 URL을 동적으로 설정하는 것을 의미합니다. 시작하려면이 블로그 게시물을 참조하십시오 . 콜백 URL은 알다시피 url 매개 변수를 자동으로 삭제하므로 매개 변수로이 작업을 수행하면 작동하지 않습니다.
따라서 파트너 이름 / ID를 매개 변수 (삭제됨)로 전달하는 대신 partner_id
및 OmniAuth provider
가 콜백 URL의 일부가 되도록 경로를 구조화 하면 다음과 같은 결과를 얻을 수 있습니다.
/auth/:omniauth_provider/callback/:partner_id
... 유효한 콜백은 다음과 같습니다.
/auth/facebook/callback/123456
... 그러면 파트너 ID와 함께 주어진 콜백이 페이스 북에서 들어온 것을 알 수 있습니다. 123456
OmniAuth에는 이미 사용자가 어디에 있는지 알 수있는 기본 제공 방법이 있으며 여기에 설명 된대로 "origin"이라고합니다.
https://github.com/intridea/omniauth/wiki/Saving-User-Location
알다시피,이 문제를 어려운 방법으로 해결하려고 할 것 같습니다.
쿠키가 답이 될 수 있습니다. 로그인 작업에 쿠키를 저장 한 다음 /auth/:provider
인증을위한 적절한 경로 로 리디렉션하면이 문제를 해결할 수 있으며 콜백이 트리거되면 (에서 SessionsController#create
) 쿠키를 다시 읽어 리디렉션 위치를 알 수 있습니다.
따라서 지금은 "페이스 북으로 로그인"링크 (또는 앱에있는 모든 항목)가로 이동합니다 /auth/facebook
. 대신 다음과 같은 사용자 지정 작업을 만든 경우
POST /partner_auth
... URL로 호출했습니다 ...
POST example.com/partner_auth?from=partner&provider=facebook
그러면 다음과 같은 컨트롤러가있을 수 있습니다.
class PartnerAuth < ApplicationController
def create
cookies[:from] = params[:from] # creates a cookie storing the "from" value
redirect_to "auth/#{params[:provider]"
end
end
그런 다음 SessionsController#create
행동에서 당신은 ...
def create
...
destination = cookies[:from]
cookies[:from].delete
redirect_to destination # or whatever the appropriate thing is for your
# app to do with the "from" information
end
I tried to build a demo app to accomplish what I'd outlined in the other answer, but you're right - it was too complicated to try to dynamically inject a custom callback into the OmniAuth code. There is a configuration option to override the default callback, but it doesn't appear to be easy to set it dynamically.
So, it dawned on me that cookies would be way simpler, user-specific, and since you theoretically only need to store this from
information for a very short time (between when the user tries to authenticate, and when the callback is triggered), it's no big deal to create a cookie, and then delete it when the callback gets hit.
Use the 'state' Variable. Facebook allows the user to set a STATE variable.
Here is how I did it, I appended the AUTH URL with ?state=providername
http://localhost/users/auth/facebook?state=providername
This param is returned to me at Callback as params['providername']
I devised the solution from the original Omniauth Path Method
user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>
ReferenceURL : https://stackoverflow.com/questions/9890985/passing-parameters-through-omniauth
'programing' 카테고리의 다른 글
항목이 데이터베이스 열에 두 번 이상 나타나는지 확인 (0) | 2021.01.17 |
---|---|
CSS-마우스 오버가 요소를 통과하여 커버 된 요소에 마우스 오버를 활성화합니다. (0) | 2021.01.17 |
Python 문서 용 reStructuredText에 대한 실제 대안이 있습니까? (0) | 2021.01.17 |
Webclient / HttpWebRequest with Basic Authentication returns 404 not found for valid URL (0) | 2021.01.17 |
Output pyodbc cursor results as python dictionary (0) | 2021.01.17 |