2014-01-30 6 views
0

나는 포 스퀘어 API의 C#을 모델링 SharpSquare 사용하고, 나는 액세스 토큰이 반환 URL을 기반으로하기 1.Web API 내부에서 C#을 사용하여 Foursquare OAuth 요청 코드를 얻는 방법은 무엇입니까?

  1. 이 정사각형
  2. 에서 "코드"를 가져 오기 단계에 갇혀와지고있어

    다음 "코드"
  3. 쿼리 API

SharpSquare 문서는이 보여줍니다

ASP.NET 웹 API 메서드 내에서 Foursquare API를 에서 쿼리하려고합니다. 나는 이것을 할 수 없다 : HyperLink.NavigateUrl = sharpSquare.GetAuthenticateUrl(redirectUri);

나는 "코드"를 얻기 위해 무엇을 할 수 있습니까? () 다양한 WebClient() & WebRequest/WebResponse 시도를 시도했지만 실제로 작동하지 않습니다.).

답변

4

기본적으로이 인증은 2 단계 프로세스입니다. 먼저 GetAuthenticateUrl() 전화를 사용하여 인증 URL을 생성하고 사용자를 해당 URL로 리디렉션해야합니다. 사용자가 성공적으로 인증하면 FourSquare는 code 매개 변수를 전달하여 사용자가 제공 한 리디렉션 URL을 호출합니다. GetAccessToken() 호출로 액세스 토큰을 교환해야합니다. 위는 콜백 함수에서 사용자 컨텍스트를 복구 할 수 있도록 리디렉션 URL에 전달할 수 있습니다 단지 임의의 문자열입니다

public ActionResult UserClicksAuthenticate() 
{ 
    var redirectUri = Request.Url.Authority + this.Url.Action("AuthorizeCallback", new {userCode = "userCode"}); 
    var sharpSquare = new SharpSquare(clientId, clientSecret); 
    var authUrl = sharpSquare.GetAuthenticateUrl(redirectUri); 

    return new RedirectResult(authUrl, permanent: false); 
} 

public ActionResult AuthorizeCallback(string code, string userCode) 
{ 
    var redirectUri = Request.Url.Authority + this.Url.Action("AuthorizeCallback", new { userCode = userCode }); 

    var sharpSquare = new SharpSquare(clientId, clientSecret);  
    var accessToken = sharpSquare.GetAccessToken(redirectUri, code); 

    // need this in order to make calls to API 
    // it's redundant because token is already set in GetAccessToken() call but it helps to understand the workflow better. 
    sharpSquare.SetAccessToken(accessToken); 

    List<VenueHistory> venues = sharpSquare.GetUserVenueHistory(); 

    return View("Index"); 
} 

public ActionResult GetVenues() 
{ 
    var sharpSquare = new SharpSquare(clientId, clientSecret, appToken);  

    List<VenueHistory> venues = sharpSquare.GetUserVenueHistory(); 

    return View("Index"); 
} 

userCode : 여기

샘플 MVC 코드입니다. 예를 들어, 이것은 페이지 코드, 사용자 ID 또는 이벤트 이름 일 수 있습니다.

업데이트 : : 주제 시동기는 "사용자 없음"액세스에 관심이있었습니다 (FourSquare dev page here 참조). 실제로 이러한 작업을 수행하려면 액세스 토큰을 가져올 필요가 없으며 APP ID & SECRET 만 필요합니다. 실제로 전용 응용 프로그램 ID가 필요합니다

private FourSquareSingleResponse<T> GetSingle<T>(string endpoint, bool unauthenticated) where T : FourSquareEntity 

/when calling API 비밀 : SharpSquare implementation 보면, 나는이 bool unauthenticated 매개 변수를 가진 overload가 있습니다 것으로 나타났습니다.

public Venue GetVenue(string venueId) 
public List<Venue> SearchVenues(Dictionary<string, string> parameters) 
public List<Checkin> GetVenueHereNow(string venueId, Dictionary<string, string> parameters) 
public List<Tip> GetVenueTips(string venueId, Dictionary<string, string> parameters) 
public List<Photo> GetVenuePhotos(string venueId, Dictionary<string, string> parameters) 
public List<Link> GetVenueLinks(string venueId) 
public Tip GetTip(string tipId) 
public Special GetSpecial(string specialId) 

을 당신이 당신의 WebAPI의 행동에 이러한 방법을 호출 할 경우 액세스 토큰을 필요로하지 않는 것을 의미한다 :

이 매개 변수는 다음과 같은 공용 메소드가 호출 될 때 true로 설정

public ActionResult SearchVenues() 
{ 
    var sharpSquare = new SharpSquare(clientId, clientSecret);  

    List<VenueHistory> venues = sharpSquare.SearchVenues(<<params>>); 

    return View(venues); 
} 
+0

2 가지 MVC 작업 대신 하나의 웹 API 작업 내에서 모든 작업을 수행하고 싶습니다. 사용자를 인증하는 것이 아니라 Foursquare API를 호출하여 (내 앱의 자격증 명을 사용하여) 장소 데이터를 가져 오는 것입니다. 그래서 C#'WebClient()를 사용하여이 작업을 수행하는 방법을 궁금합니다. 어떤 아이디어? – Chaddeus

+1

API를 (장소 데이터를 얻기 위해) 호출하려면 액세스 토큰이 있어야합니다. 이미 가지고있는 경우 SharpSquare (APP_ID, APP_SECRET, ACCESS_TOKEN) 생성자를 사용하고 API 함수를 호출해야합니다.내 편집보기 - 거기에 GetVenues() 함수가 추가되었습니다. 그러나 액세스 토큰을 갖고 있지 않으면 암호를 알더라도 FourSquare 로그인 페이지에서 사용자가 로그인하지 않아도 사용자 상호 작용 없이는 액세스 토큰을 얻을 수 없습니다. 이것이 FB, Twitter 및 기타 모든 OAuth2 사이트의 작동 방식입니다. 즉, WebApi 컨트롤러에서 ** 단일 ** 통화로 회의장을 가져올 수 없습니다. – avs099

+0

다시 한번 - 앱 자격 정보 (앱 ID/비밀을 의미한다고 가정 함)는 아무 의미가 없습니다. API 만 사용하면 앱을 호출 할 수 없습니다. 앱은 USER의 컨텍스트에서만 유효합니다. 그래서 액세스 토큰이 필요한 것입니다. 따라서 사용자는 사용자를 대신하여 특정 작업을 수행하도록 앱을 승인해야합니다. 그건 FourSquare 로그인 페이지가 어쩔 수 없다는 것을 의미합니다. 사용자가 앱을 인증 할 수 있도록 사용자를 리디렉션해야합니다. 희망은 그 말이 맞습니다. – avs099