1
0
mirror of https://github.com/hotomoe/hotomoe synced 2024-11-28 23:08:17 +09:00

[BREAKING CHANGE] Improve security

This commit is contained in:
syuilo 2017-01-06 11:50:46 +09:00
parent 86548f6468
commit 9458245382
5 changed files with 19 additions and 3 deletions

View File

@ -70,5 +70,7 @@ block content
| 次に、<code>#{api_url}/auth/session/userkey</code>へ<code>app_secret</code>としてApp Secretを、<code>token</code>としてセッションのトークンをパラメータとして付与したリクエストを送信してください。 | 次に、<code>#{api_url}/auth/session/userkey</code>へ<code>app_secret</code>としてApp Secretを、<code>token</code>としてセッションのトークンをパラメータとして付与したリクエストを送信してください。
br br
| 上手くいけば、認証したユーザーのアクセストークンがレスポンスとして取得できます。おめでとうございます! | 上手くいけば、認証したユーザーのアクセストークンがレスポンスとして取得できます。おめでとうございます!
p
| 以降アクセストークンは、<strong>ユーザーのアクセストークン+アプリのシークレットキーをsha512したもの</strong>として扱います。
p アクセストークンを取得できたら、あとは簡単です。REST APIなら、リクエストにアクセストークンを<code>i</code>としてパラメータに含めるだけです。 p アクセストークンを取得できたら、あとは簡単です。REST APIなら、リクエストにアクセストークンを<code>i</code>としてパラメータに含めるだけです。

View File

@ -69,6 +69,7 @@
"compression": "1.6.2", "compression": "1.6.2",
"cors": "2.8.1", "cors": "2.8.1",
"cropperjs": "1.0.0-beta", "cropperjs": "1.0.0-beta",
"crypto": "0.0.3",
"deepcopy": "0.6.3", "deepcopy": "0.6.3",
"del": "2.2.2", "del": "2.2.2",
"elasticsearch": "12.1.3", "elasticsearch": "12.1.3",

View File

@ -43,7 +43,7 @@ export default (req: express.Request) => new Promise<IAuthContext>(async (resolv
}); });
} else { } else {
const userkeyDoc = await Userkey.findOne({ const userkeyDoc = await Userkey.findOne({
key: token hash: token
}); });
if (userkeyDoc === null) { if (userkeyDoc === null) {

View File

@ -4,6 +4,8 @@
* Module dependencies * Module dependencies
*/ */
import rndstr from 'rndstr'; import rndstr from 'rndstr';
const crypto = require('crypto');
import App from '../../models/app';
import AuthSess from '../../models/auth-session'; import AuthSess from '../../models/auth-session';
import Userkey from '../../models/userkey'; import Userkey from '../../models/userkey';
@ -41,12 +43,23 @@ module.exports = (params, user) =>
}); });
if (exist === null) { if (exist === null) {
// Lookup app
const app = await App.findOne({
app_id: session.app_id
});
// Generate Hash
const sha512 = crypto.createHash('sha512');
sha512.update(key + app.secret);
const hash = sha512.digest('hex');
// Insert userkey doc // Insert userkey doc
await Userkey.insert({ await Userkey.insert({
created_at: new Date(), created_at: new Date(),
app_id: session.app_id, app_id: session.app_id,
user_id: user._id, user_id: user._id,
key: key key: key,
hash: hash
}); });
} }

View File

@ -64,7 +64,7 @@ function authenticate(connection: websocket.connection, token: string): Promise<
resolve(user); resolve(user);
} else { } else {
const userkey = await Userkey.findOne({ const userkey = await Userkey.findOne({
key: token hash: token
}); });
if (userkey == null) { if (userkey == null) {