programing

OmniAuth를 통해 매개 변수 전달

sourcetip 2021. 1. 17. 12:39
반응형

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

반응형