読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Advent Calendar 8 - MeteorでSNS

Meteorのaccounts関連のパッケージははアカウント管理にソーシャルサービス連携をサポートしています。
ユーザーにソーシャルサービスアカウントでアプリにサインインしてもらい時には、

のいずれかまたは複数のパッケージを追加し、UI用にaccounts-uiパッケージを追加します。
そして、HTMLに

{{loginButtons}}

を追加するだけです。
{{loginButtons}}にサインイン用のボタンが現れます。最初はソーシャルサービスの設定を促すボタンが表示されますので,必要な情報(consumer key, consumer secretなど)を入力するとデータベースに保存され、ボタンはサインイン用に変わります。

サービスの情報はAccounts.loginServiceConfigurationというコレクションに保存されます。
例えば、Twitterのconsumer key, consumer secretを取り出すには、

    service = Accounts.loginServiceConfiguration.findOne service: 'twitter'
    console.log service.consumerKey, service.secret

ユーザーがソーシャルサービスを使ってサインインすると、access token, access token secretは、Meteor.usersコレクションに保存されます。
なので、例えば、NPMのnode-twitterパッケージを使ってツイートしようと思うと、以下のようになります。

# tweets status.
#  user: document in Meteor.users
#  status: string
#  callback: callback after tweet
tweet = (user, status, callback) ->
    return unless user?
    callback ?= (data) -> console.log data if data.errors?
    service = Accounts.loginServiceConfiguration.findOne service: 'twitter'
    if service? and user.services?.twitter?
        new Twitter(
            consumer_key: service.consumerKey
            consumer_secret: service.secret
            access_token_key: user.services.twitter.accessToken
            access_token_secret: user.services.twitter.accessTokenSecret
        ).updateStatus status, callback

OAuth1.0aの複雑なコードは不要です。(必要だとしてもnode-twitterパッケージ使えばいいのですが)

開発者にAPIを用意して呼び出しは開発者に任せるような感じではなく、パッケージを追加すると、ソーシャルサービス関連のデータベースを作り、UIボタンで設定をするとそこに保存するような能動的なパッケージ作りがMeteorの特長のようです。