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

<font color="red">※タイトルにOAuthと入っていますが、このシステムはOAuthに準拠していません。</font>

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

<img width="1280" alt="img" src="https://qiita-image-store.s3.amazonaws.com/0/156669/172f24f5-2ea6-5b80-eeba-c55f7d3745ff.png">
https://secure.nicovideo.jp/form/sdk

アプリでしか使えないというクソ仕様でした。さらにアプリだとしても個人では使えないようです
[ニコニコOAuthは個人では申請が通らない](http://qiita.com/YusukeSuzuki@github/items/b6f2d7e92865ff6b487e)

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

# 使い方

##①app_idとapp_id_secret取得
まずは[アカウント作成ページ](https://niconico.oauth.tsumugu2626.xyz/account/regist.php)からアカウントを作成します。
<img width="1280" alt="img" src="https://qiita-image-store.s3.amazonaws.com/0/156669/991e287b-8a13-3779-45bb-db1df74836fc.png">
そしてログインすると[アプリ一覧ページ](https://niconico.oauth.tsumugu2626.xyz/account/apps.php)に飛びます。
アプリ一覧ページ左上の新規登録をクリックすると新規作成できます。
<img width="1280" alt="img" src="https://qiita-image-store.s3.amazonaws.com/0/156669/6457b2e1-00c2-c288-6869-9dc27792aa45.png">
各項目は適当に埋めてください

<img width="1280" alt="スクリーンショット 2017-08-08 15.09.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/156669/ed73f91b-c2de-3285-f1d2-db781bcb2565.png">
ここのapp_idとapp_id_secretはメモっときましょう。
ちなみに再発行には対応していないので流出したら終わります。

##②request_tokenを取得する
```php
<?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 width="1280" alt="img" src="https://qiita-image-store.s3.amazonaws.com/0/156669/3471c632-0c9d-26ec-688a-76808121ce98.png">

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

###許可するボタンを押した場合
あらかじめ設定されていたcallbackurlにパラメータをつけてリダイレクトします

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

###許可しないボタンを押した場合
あらかじめ設定されていたcallbackurlにパラメータをつけずにリダイレクトします

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

##④ユーザデータの取得

```php
$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対応させて個人でも使えるようにしてください。お願いします。