'facebook'에 해당하는 글 3건


페이스북의 보안 업데이트 때문에 설정 항목이 하나 추가 됐다.


[리디렉션 URI에 Strict 모드 사용]


기존에는 페이스북 OAuth 로그인을 사용할 때 [유효한 OAuth 리디렉션 URI] 항목에 리다이렉트 될 서버의 도메인만을 입력하면 문제없이 로그인에 성공했는데, [리디렉션 URI에 Strict 모드 사용] 항목에 체크하는 순간 리디렉션 URI 가 엄격해진다. Strict 모드 사용에 체크하면 다시 되돌릴 수 없다는게 함정. 체크하는 순간부터 이 버튼은 비활성화로 바뀐다. ㅋㅋ 곧 이 옵션을 강제한다는 의미? [유효한 OAuth 리디렉션 URI] 에 기존처럼 도메인만 입력할 경우 (예, http://mydomain.com) 다음과 같은 오류 메시지를 만나게 된다.





오류 

차단된 URL: 리디렉션 URI가 앱의 클라이언트 OAuth 설정의 화이트리스트에 없으므로 리디렉션하지 못했습니다. 클라이언트 및 웹 OAuth 로그인이 설정되었는지 확인하고 모든 앱 도메인을 유효한 OAuth 리디렉션 URI로 추가하세요.


오류 메시지 만으로는 당최 뭘 하라는 건지 명확하게 이해가 안간다;

앱 도메인 추가니, 화이트리스트 등록이니 이 딴거 다 필요없고, [유효한 OAuth 리디렉션 URI] 만 잘 기입하면 된다. strict 하게.

리디렉션 URI 는 페이스북에 로그인 요청시 client_id 등과 함께 전달하는 uri 로 로그인 성공시 토큰과 함께 반환될 사이트의 uri 이다.

로그인 요청시에 전달하는 이 redirect_uri 를 그대로 [유효한 OAuth 리디렉션 URI] 항목에 기입하면 된다.


https://mydomain.com/login/externalReceive?social=facebook <- 이런 식으로.


dev / prod 등 여러 서버 도메인이 존재할 경우 그냥 다 기입하면 된다.


로그인 체크, 끝~



- 2020-01-06 : 

현재 [유효한 OAuth 리디렉션 URI] 프로토콜이 https 가 필수임. 개발모드에서는 localhost 에 대해서만 http 프로토콜이 가능하며(http://localhost), 나머지 도메인은 https 가 아닌 경우 리디렉션 불가...



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

SNS crawling

Tool/OAuth 2017. 12. 19. 00:29

대부분의 SNS 마다 로그인/글쓰기/글읽기 등을 위한 API 를 제공한다. 또한 각 SNS 에서 제공하는 여러 토큰 유형을 각 서비스에 맞게 활용하여야 한다. 흔히 게임이나 웹서비스에서 이미 가입된 SNS 계정으로 로그인하는 방식이 일반적인 SNS 사용자 인증 방식이다. 각 사용자를 로그인 시켜, 해당 사용자의 정보를 가져오는 것이다. 예를 들어, A 라는 서비스를 사용시 페이스북 계정으로 로그인하면, 페이스북으로부터 로그인한(인증된) 사용자의 정보가 A 서비스로 전달되는, OAuth 라는 인증 방식을 주로 사용한다. 즉, 사용자의 데이터(개인 정보 등) 를 읽어올 때, 사용자 액세스 토큰을 생성하면 된다.


그렇다면 내 사이트에 뿔뿔히 흩어진 SNS 의 내 게시물들을 표시하고 싶다면 어떻게 해야 할까. 위 사용자 액세스 토큰을 취득하기 위해, 매번 각각의 SNS 로그인 화면에서 id/pw 를 입력할 수는 없다. 이 때는 각 SNS 의 개발자 모드에서 앱을 생성하고 발급된 client_id / client_secret 를 전달하는 식으로 앱 액세스 토큰을 발급받아 사용하면 된다. 아래는 SNS crawling 을 위해 로그인을 하지 않고 각 계정의 데이터를 가져온 Java 코드의 예이다. (without redirect_url)



Facebook


서비스가 Spring 기반이라 Spring Social Facebook 을 사용해 보려 했으나, 사용자 인증 방식 밖에 안된다. 즉, 로그인 인증을 거치게 된다. 페이스북 API 버전도 너무 오래된 걸 사용하고 있고... 다음처럼 페이스북 그래프 API 를 사용하여 앱 액세스 토큰을 발급받는다.


GET /oauth/access_token
    ?client_id={app-id}
    &client_secret={app-secret}
    &grant_type=client_credentials
Host: graph.facebook.com
cs


데이터를 읽어오거나 할 때는, 각 파라미터 끝에 access_token 만 추가하면 된다.


GET /v2.11/me/feed?access_token={access_token}
Host: graph.facebook.com
cs


반환된 데이터에서 paging.next 가 없어질 때까지 계속 돌리면 모든 피드 데이터를 가져올 수 있다.



Twitter


트위터는 조금 더 까다롭다. client_id / client_secret 를 전달하는데 Base64 인코딩을 하여 Authorization 헤더에 담아 POST 방식으로 보낸다. bearer access_token 이 반환되며, 이 토큰을 API 요청시 Authorization 헤더에 담아 요청하면 된다. 이 과정을 간단하게 해결해주는 라이브러리를 twitter4j 에서 제공한다.


gradle 등의 빌드 툴로 twitter4j 를 가져온다.


compile group: 'org.twitter4j', name: 'twitter4j-http2-support', version: '4.0.6'
cs


그리고 토큰을 가져와 twitter 인스턴스를 만드는 코드이다. consumerKey 와 consumerSecret 만 넣으면 된다.


ConfigurationBuilder cb = new ConfigurationBuilder();
 
cb.setApplicationOnlyAuthEnabled(true);
cb.setOAuthConsumerKey(consumerKey);
cb.setOAuthConsumerSecret(consumerSecret);
 
try {
    OAuth2Token token = new TwitterFactory(cb.build()).getInstance().getOAuth2Token();
 
    cb = new ConfigurationBuilder();
    cb.setApplicationOnlyAuthEnabled(true);
    cb.setOAuthConsumerKey(consumerKey);
    cb.setOAuthConsumerSecret(consumerSecret);
    cb.setOAuth2TokenType(token.getTokenType());
    cb.setOAuth2AccessToken(token.getAccessToken());
 
    twitter = new TwitterFactory(cb.build()).getInstance();
catch (TwitterException e) {
    e.printStackTrace();
}
cs


반환된 데이터에서 page + 1 로 반환되는 데이터가 없을 때까지 계속 돌리면 모든 트윗을 가져올 수 있다.



Youtube


유투브도 OAuth 2.0 기반의 인증 방식을 사용하지만 약간의 추가 설정이 필요하다. 우선 유투브 API 를 사용하려면 구글 개발자 콘솔에서 라이브러리의 YouTube Data API v3 을 활성화 해야 한다. 그리고 사용자 인증 정보 메뉴에서 서비스 계정(Service account) 키를 생성하고, 비공개 키가 포함된 정보를 json 파일로 다운받아야 한다. 서비스 계정은 사용자 정보에 액세스하지 않는 API를 호출하는 애플리케이션에서 사용된다.


표준 라이브러리를 사용하여 구현해 본다.


compile group: 'com.google.apis', name: 'google-api-services-youtube', version: 'v3-rev188-1.23.0'
compile group: 'com.google.oauth-client', name: 'google-oauth-client-java6', version: '1.23.0'
compile group: 'com.google.oauth-client', name: 'google-oauth-client-jetty', version: '1.23.0'
cs


그리고 YouTube 인스턴스를 만들어 데이터를 가져온다.


public static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
public static final JsonFactory JSON_FACTORY = new JacksonFactory();
 
private YouTube youtube;
 
public YoutubeService() {
    List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube.readonly");
 
    GoogleCredential credential = null;
    try {
        credential = GoogleCredential.fromStream(YoutubeService.class
                .getResourceAsStream("/service-account.json")).createScoped(scopes);
    } catch (IOException e) {
        e.printStackTrace();
    }
 
    // This object is used to make YouTube Data API requests.
    youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName("oops4u").build();
}
cs


반환된 데이터에서 nextPageToken 이 없어질 때까지 계속 돌리면 모든 동영상 데이터를 가져올 수 있다.



Instagram


인스타그램은... 현재 인증 및 권한 부여를 위해 OAuth 2.0 을 사용중이나, 권한 부여 과정에서 return URL 을 필요로 하고 있으며 다른 대안은 없다. 그러나... 이걸 또 해낸 사람들이 있네.


https://github.com/postaddictme/instagram-java-scraper

https://jitpack.io/#postaddictme/instagram-java-scraper/0.3.0


인증이 필요없는 장점. 옛날 endpoint 를 가지고 있긴 한데 막힐 때까지는 쓸만할 듯.


OkHttpClient okHttpClient = new OkHttpClient();
Instagram instagram = new Instagram(okHttpClient);
cs


계정 게시물 수 가져오고 그만큼 미디어 겟하면 끝.



-----------------------------------------------------------------------------------


2018년 10월 - instagram 정책변경으로 위 api 막힘 - instagram4j 대체.


// https://mvnrepository.com/artifact/org.brunocvcunha.instagram4j/instagram4j
compile ('org.brunocvcunha.instagram4j:instagram4j:1.7') {
    exclude group: 'org.bytedeco'
}
cs



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Facebook ID

Daily/Prog 2015. 9. 9. 01:10

 

 

 

Facebook API 를 사용하여 Token 을 얻어 로그인한 사용자의 정보를 얻어낼 수 있다.

 

https://www.facebook.com/dialog/oauth?client_id={facebook_AppID}&response_type=token&redirect_uri={RedirectUri}

 

위의 URL에 페이스북 개발자 페이지에서 등록한 App ID를 입력하고 토큰을 받을 redirect_uri 를 설정하면 토큰을 얻을 수 있다.
얻어낸 토큰을 이용하여 아래와 같이 필요한 항목들을 나열하면 해당 정보들을 얻을 수 있다.

 

https://graph.facebook.com/me?fields=id,email,name,first_name,last_name,gender,locale,picture&access_token={token}

 

문제는 반환된 id 가 facebook 에서 사용하는 유일한 아이디일 것으로 확신했던 것이 나의 큰 오산이었다.
Facebook API 버전을 v2.0 에서 v2.4 로 업그레이드를 한답시고 app_id 를 신규 발급 했는데 각자 다른 id 가 돌아오는게 아닌가.
기존 회원정보 DB랑 ID가 일치하지 않는다면...ㅋ;
Dash board 에서 세팅을 바꿔봐도 원래 id 는 돌아오지 않았고 API 버전 역시 다운그레이드 되지 않았다.
API 버전문제라 생각하고 구글링만 죽어라 하고...
결국 오랜 삽질 끝에 반환된 id는 Facebook 의 유일한 id가 아닌 등록된 App 의 유일한 id로 검증되었다.

 

https://www.facebook.com/app_scoped_user_id/861203280607126
https://www.facebook.com/app_scoped_user_id/951486641578789

 

두개의 App 에서 반환된 각자 다른 내 ID가, 모두 내 타임라인으로 들어가는 것을 확인.
ㅋㅋ...

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,