LoginSignup
8
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-08

※タイトルに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を保存しているだけなのでメアド、パスワード流出の危険がなく安全です。

デモページ

最後に

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

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7