PHP
OAuth
ニコニコ動画

ニコニコOAuthシステムWeb版を自作した話。

More than 1 year has passed since last update.

※タイトルにOAuthと入っていますが、このシステムはOAuthに準拠していません。

はじめに

ニコ動関連のWebサービスを作ろうと思い、OAuthシステムがないか調べたところ、あったのですが

img
https://secure.nicovideo.jp/form/sdk

アプリでしか使えないというクソ仕様でした。さらにアプリだとしても個人では使えないようです
ニコニコOAuthは個人では申請が通らない

ならば自作するしかない、というわけで作った。

使い方

①app_idとapp_id_secret取得

まずはアカウント作成ページからアカウントを作成します。
img
そしてログインするとアプリ一覧ページに飛びます。
アプリ一覧ページ左上の新規登録をクリックすると新規作成できます。
img
各項目は適当に埋めてください

スクリーンショット 2017-08-08 15.09.24.png
ここのapp_idとapp_id_secretはメモっときましょう。
ちなみに再発行には対応していないので流出したら終わります。

②request_tokenを取得する

<?php
$request_url = "https://niconico.oauth.tsumugu2626.xyz/request_token.php";
$post_data = array(
    "app_id" => "<さっきのapp_id>",
    "app_id_secret" => "<さっきのapp_id_secret>",
);
$curl=curl_init($request_url);
curl_setopt($curl,CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl,CURLOPT_COOKIEJAR,      'cookie');
curl_setopt($curl,CURLOPT_COOKIEFILE,     'tmp');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE);
$output = curl_exec($curl);
$json_decode = json_decode($output,true);

$req_token = $json_decode["request_token"];
if (!empty($req_token)) {
  header("Location: https://niconico.oauth.tsumugu2626.xyz/authenticate.php?request_token=$req_token");
  exit;
} else {
  echo "app_idかapp_id_secretが間違っています";
}

連携しますか?ページに飛ばすにはリクエストトークンが必要なので、 request_token.php にPOSTしてリクエストトークンを取得します。取得できたら authenticate.php(連携しますか?ページ) に先ほどのリクエストトークンをつけてリダイレクトさせます

③連携しますか?ページの挙動

img
デザインダサいとか言わないで...

許可するボタンを押した場合

あらかじめ設定されていたcallbackurlにパラメータをつけてリダイレクトします

http://example.com/?api_request_token=5fx7358x8f160da9fafdb3cxs5261095&reqest_token=6120d40d33f5e74cdab303b817d7ae18

許可しないボタンを押した場合

あらかじめ設定されていたcallbackurlにパラメータをつけずにリダイレクトします

http://example.com/?api_request_token=&reqest_token=

④ユーザデータの取得

$a_r_t = $_GET["api_request_token"];
if (empty($a_r_t)) {
  echo "キャンセルされました";
  exit;
}
$url = "https://niconico.oauth.tsumugu2626.xyz/api/data.php?api_request_token=$a_r_t";
$fg = @file_get_contents($url);
$json_decode = json_decode($fg);
var_dump($json_decode);

基本的にはapi_request_tokenをapiに渡すだけ。

セキュリティ

ログインcookieを保存しているだけなのでメアド、パスワード流出の危険がなく安全です。

デモページ

https://niconico.oauth.tsumugu2626.xyz/test/

最後に

ドワンゴさん、OAuthシステムをWeb対応させて個人でも使えるようにしてください。お願いします。