ぶらっ記ぃ

日本語の練習をしています

scribejavaでOAuthの認証を行いアクセストークンを取得する

github.com

ここに書いてある通り。

この記事ではTwitterを対象にAmmoniteでやります。

依存を追加

執筆時点の最新版を使います

@ import $ivy.`com.github.scribejava:scribejava-apis:6.4.1`
import $ivy.$

サービスクラスのインスタンスを得る

Twitter, Yahoo! など、デフォルトでいくつかのWebサービスに対応したクラスが提供されている。

@ import com.github.scribejava.apis.
AWeberApi                              KeycloakApi                            TumblrApi
Asana20Api                             LinkedInApi                            TutByApi
AutomaticAPI                           LinkedInApi20                          TwitterApi
BoxApi20                               LiveApi                                UcozApi
DataportenApi                          MailruApi                              ViadeoApi
DiggApi                                MediaWikiApi                           VkontakteApi
DiscordApi                             MeetupApi                              WunderlistAPI
DoktornaraboteApi                      MicrosoftAzureActiveDirectory20Api     XingApi
EtsyApi                                MicrosoftAzureActiveDirectoryApi       YahooApi
FacebookApi                            MisfitApi                              YahooApi20
FitbitApi20                            NaverApi                               facebook
FlickrApi                              OdnoklassnikiApi                       fitbit
Foursquare2Api                         PinterestApi                           imgur
FoursquareApi                          Px500Api                               mailru
FrappeApi                              RenrenApi                              microsoftazureactivedirectory
FreelancerApi                          SalesforceApi                          odnoklassniki
GeniusApi                              SinaWeiboApi                           openid
GitHubApi                              SinaWeiboApi20                         salesforce
GoogleApi20                            SkyrockApi                             tutby
HHApi                                  StackExchangeApi                       vk
HiOrgServerApi20                       TheThingsNetworkV1StagingApi           wunderlist
ImgurApi                               TheThingsNetworkV2PreviewApi
KaixinApi20                            TrelloApi

Twitterだとこんな感じ

@ import com.github.scribejava.core.builder.ServiceBuilder
import com.github.scribejava.core.builder.ServiceBuilder

@ import com.github.scribejava.apis.TwitterApi
import com.github.scribejava.apis.TwitterApi

@ val twitter = new ServiceBuilder("your_api_key").apiSecret("your_api_secret").build(TwitterApi.instance)
twitter: com.github.scribejava.core.oauth.OAuth10aService = com.github.scribejava.core.oauth.OAuth10aService@160cf225

リクエストークンを取得する

@ val requestToken = twitter.getRequestToken
requestToken: com.github.scribejava.core.model.OAuth1RequestToken = com.github.scribejava.core.model.OAuth1RequestToken@f46f5616

「簡単でしょう?」 と、ドキュメントでは言っている

認証画面のURLを得る

@ val authUrl = twitter.getAuthorizationUrl(requestToken)
authUrl: String = "https://api.twitter.com/oauth/authorize?oauth_token=x8052gAAAAAA3Q69Axxxxxxxxxx"

ユーザ認証を行いPINを得る

前節の authUrl をブラウザで開く。
コピペが面倒なひとは java.aws.Desktop#browse を使うといいでしょう。

@ java.awt.Desktop.getDesktop.browse(new java.net.URI(authUrl))
(ブラウザが開く)

2019-08-22_21-24.png (68.9 kB)

2019-08-22_21-26.png (43.0 kB)

RequestToken と PIN から AccessToken を得る

@ val accessToken = twitter.getAccessToken(requestToken, "3xxxxx4")
accessToken: com.github.scribejava.core.model.OAuth1AccessToken = com.github.scribejava.core.model.OAuth1AccessToken@f8e4cf29

@ accessToken.getToken
res15: String = "your_access_token"

@ accessToken.getTokenSecret
res16: String = "your_token_secret"

やった~

(おまけ) Twitterのアクセストークンを取得するScalaスクリプト

というわけで、いつものScalaスクリプトです。

twitter_auth.sc

import $ivy.`com.github.scribejava:scribejava-apis:6.4.1`

import com.github.scribejava.core.builder.ServiceBuilder
import com.github.scribejava.apis.TwitterApi

import java.awt.Desktop
import java.net.URI

@main
def main(apiKey: String, apiSecret: String): Unit = {
  val twitter = new ServiceBuilder(apiKey).apiSecret(apiSecret).build(TwitterApi.instance)
  val requestToken = twitter.getRequestToken()
  val authUrl = twitter.getAuthorizationUrl(requestToken)

  Desktop.getDesktop.browse(new URI(authUrl))

  println("Enter the PIN...")
  val pin = scala.io.StdIn.readLine

  val accessToken = twitter.getAccessToken(requestToken, pin)
  println(s"Access Token: ${accessToken.getToken}")
  println(s"Access Token Secret: ${accessToken.getTokenSecret}")
}
amm twitter_auth.sc --apiKey your_api_key --apiSecret your_api_secret

ngrok とか、 serveo をうまく使えばPINの入力も不要になるかも。