2

LinkedIn/Twitter で OAuth 1 3-legged または 2-legged 承認を行う方法についての質問を見たので、JOAuthを使用して Twitter への承認をどのように達成したかの例を投稿しようと思いました。

4

1 に答える 1

3

net.oauth.token.v1.AccessTokenこれは、Twitter からアクセス トークンを取得する方法です。

まず、アプリケーションを Twitter に登録してアプリケーションを取得するために、Twitter から 2 つのものが必要になります。

  • API キー (OAuth はコンシューマー キーを呼び出します)
  • API シークレット (OAuth はそれをコンシューマ シークレットと呼びます)。

ここで、Twitter に対して認証する方法を次に示します。

まず、API キーとシークレットを含む 2 つのメソッドを用意しましょう。

private static final String API_KEY = "TWITTER_API_KEY_HERE";
private static final String API_SECRET  = "TWITTER_API_SECRET_HERE";

そうそう、次のものが必要ですcallback_url:

private static final String CALLBACK_URL = "oob";

oob(Out-of-Band)については後で説明します。

次に、OAuth 認証を行うコンシューマーを作成する必要があります。

private OAuth1Consumer consumer = new OAuth1Consumer(API_KEY, API_SECRET, new OAuth1ServiceProvider("https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/authorize", "https://api.twitter.com/oauth/access_token"));

パラメーターは次のとおりです。API キー、次は API シークレット、OAuth サービス プロバイダー (リクエスト トークン URL、承認トークン URL、アクセス トークン URL で構成されます)。

さあ、楽しみを始めましょう:

(未承認の) リクエスト トークンのリクエスト:

リクエスト トークンを取得するには、requestUnauthorizedTokenfromOAuth1Consumerクラスを呼び出す必要があります。

RequestToken requestToken = consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature());

最初のパラメーターはrealmnull で (Twitter では実際には使用されないため)、次にcallback_url、および署名メソッドです。

3 つの有効な OAuth 署名方法があります。

  • PLAINTEXT (プレーンテキストでそのまま送信)、class OAuthPlainTextSignature.
  • HMAC-SHA1、クラスOAuthHmacSha1Signature.
  • RSA-SHA1、クラスOAuthRsaSha1Signature.

Twitter は HMAC-SHA1 を使用します。他のプロバイダーに対して OAuth を行う場合は、ドキュメントを参照してください。

承認されていないリクエスト トークンができたので、それを承認しましょう。

(未承認の) リクエスト トークンの承認:

承認には、ユーザーがサービス プロバイダーの URL にアクセスしてサインインする必要があるため、ブラウザーでリダイレクトできる URL が必要です。

String url = consumer.createOAuthUserAuthorizationUrl(requestToken, null);

(2 番目のパラメーターはnull、送信する追加の HTTP パラメーターがないためですが、送信する場合は、Map<String, String>属性を作成し、それらを入力して、メソッド呼び出しでチャンクします:))

URL を取得したので、URL をブラウザーにチャックし、アプリケーションを承認しますcallback_url

帯域外 (OOB) 承認

OOB 認証は、HTTP リダイレクトを実行できないが、アクセス トークンを要求したいアプリケーションに使用されます。Twitter は、HTTP リダイレクトの代わりに PIN が使用されると述べています。その PIN (Twitter アプリケーションを承認した後に表示される) は、Twitter によってブラウザー上の画像として表示されます。詳細については、Twitter OAuth API ドキュメントを参照してください。

OOB ベースの呼び出しでは、アプリケーションを承認すると、Twitter から PIN が送信されます。PIN が表示されたら、アクセス トークンを取得するには、次の手順を実行します。

String twitterPin = ""; //Whatever Twitter displayed
AccessToken accessToken = example.requestAccessToken(new AuthorizedToken(requestToken.getToken(), twitterPin), requestToken);

さあ、いくぞ。

アクセス トークンを呼び出すと、実際のアクセス トークンの値はAccessToken.getToken()メソッド上にあります。

コールバック リダイレクト(非 OOB)

callback_urlasを設定しなかった場合oob、Twitter は承認されたトークンでアプリケーションを承認した後、アプリケーションにリダイレクトします。これを処理するプロセスを作成したので、これOAuthServletを行う必要があります。

まず、次のように、oauth-config.xmlプロジェクトのプロジェクトの下に を作成する必要があります。WEB-INF

<?xml version="1.0" encoding="UTF-8"?>
<oauth-config>
<!-- Twitter OAuth Config -->
        <oauth name="twitter" version="1">
                <consumer key="TWITTER_KEY" secret="TWITTER_SECRET" />
                <provider requestTokenUrl="https://api.twitter.com/oauth/request_token" authorizationUrl="https://api.twitter.com/oauth/authorize" accessTokenUrl="https://api.twitter.com/oauth/access_token" />
        </oauth>


        <service path="/request_token_ready" class="com.neurologic.example.TwitterOAuthService" oauth="twitter">
                <success path="/start.htm" />
        </service>
</oauth-config>

次に、web.xmlを含めるように構成する必要がありますOAuthServlet

<servlet>
    <description>An OAuth Servlet Controller</description>
    <display-name>OAuthServlet</display-name>
    <servlet-name>OAuthServlet</servlet-name>
    <servlet-class>com.neurologic.oauth.servlet.OAuthServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/oauth-config.xml</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>OAuthServlet</servlet-name>
    <url-pattern>/oauth/*</url-pattern>
</servlet-mapping>

次に、サービスを定義します。そのサービスでは、aRequestTokenおよび a realm(ご希望の場合) を提供する必要があります。私の完全なソースコードは次のとおりです。上記で取得したリクエスト トークンは、サービスを呼び出す前のセッションで保存していました。

/**
 * 
 */
package com.neurologic.example;

import javax.servlet.http.HttpServletRequest;

import net.oauth.signature.OAuthSignature;
import net.oauth.signature.impl.OAuthHmacSha1Signature;
import net.oauth.token.v1.AccessToken;
import net.oauth.token.v1.RequestToken;

import com.neurologic.oauth.service.impl.OAuth1Service;

/**
 * @author Buhake Sindi
 * @since 31 May 2011
 *
 */
public class TwitterOAuthService extends OAuth1Service {

    public static final String TWITTER_REQUEST_TOKEN_SESSION = "TWITTER_REQUEST_TOKEN_SESSION";
    public static final String TWITTER_ACCESS_TOKEN_SESSION = "TWITTER_ACCESS_TOKEN_SESSION";

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getOAuthSignature()
     */
    @Override
    protected OAuthSignature getOAuthSignature() {
        // TODO Auto-generated method stub
        return new OAuthHmacSha1Signature();
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getRealm()
     */
    @Override
    protected String getRealm() {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getRequestToken(javax.servlet.http.HttpServletRequest)
     */
    @Override
    protected RequestToken getRequestToken(HttpServletRequest request) {
        // TODO Auto-generated method stub
        return (RequestToken) request.getSession().getAttribute(TWITTER_REQUEST_TOKEN_SESSION);
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.OAuthService#saveAccessToken(javax.servlet.http.HttpServletRequest, java.lang.Object)
     */
    @Override
    public void saveAccessToken(HttpServletRequest request, AccessToken accessToken) {
        // TODO Auto-generated method stub
        request.getSession().setAttribute(TWITTER_ACCESS_TOKEN_SESSION, accessToken);
    }
}

サービスからのsaveAccessToken()メソッドは、Twitter が Access Token を受け取ったときにサービスから呼び出されるメソッドです (ここでは例として Twitter を使用していますが、任意のサービス プロバイダーを使用してかまいません)。

サーブレットは、リクエスト トークンの承認からアクセス トークンの取得までのハンドシェイクを処理し、追加のフロー コードを記述する必要はありません。

これがみんなに役立つことを願っています!

于 2011-06-15T10:05:40.857 に答える