V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yaocy
V2EX  ›  问与答

个人博客的鉴权方案

  •  
  •   yaocy · 2023-01-29 11:42:58 +08:00 · 2703 次点击
    这是一个创建于 671 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在手搓个人网站,现在考虑鉴权的问题

    场景需求是:

    1. 首先就打算自己用,所以觉得做登录没有必要
    2. 很明显博客会有后台编辑等需要鉴权的场景
    • 绑定 IP 太死了不行
    • 三方登录考虑一下

    大大们是怎么做的?有什么思路?

    25 条回复    2023-01-30 10:12:58 +08:00
    7gugu
        1
    7gugu  
       2023-01-29 11:44:26 +08:00   ❤️ 1
    直接用 wordpress 一步到位
    gra
        2
    gra  
       2023-01-29 11:45:40 +08:00
    做个登录呗,最次一个字段,没注册,简单登录验证最方便
    opengps
        3
    opengps  
       2023-01-29 11:46:20 +08:00
    我就是自己用了一个特别的路径,自己知道,然后再所有添加修改的地方,增加一个密码框就行了
    boks
        4
    boks  
       2023-01-29 11:48:28 +08:00
    ?p=xxxxxx
    yaocy
        5
    yaocy  
    OP
       2023-01-29 11:55:50 +08:00
    @7gugu 不行,我就要手搓(手动狗头)
    loading
        6
    loading  
       2023-01-29 11:56:20 +08:00
    建议 localhost
    Kinnice
        7
    Kinnice  
       2023-01-29 12:02:18 +08:00
    不要在线的后台了,只搭建个本地的后台编辑器,每次本机编辑好,生成静态文件,同步到服务器
    retrocode
        8
    retrocode  
       2023-01-29 12:05:03 +08:00
    ```php

    <?php
    $auth = array('密码 1','密码 2');
    if (empty($_COOKIE["token"])||!in_array($_COOKIE["token"],$auth)) {
    // 校验失败,不显示后续内容
    $loginhtml = <<<EOT
    <html>
    <head>
    <meta charset="utf-8">
    <title>验证失败</title>
    </head>
    <body>
    <h1>认证已过期,请输入密码</h1>
    <input type="tel" id="mobile" description="输入你的密码即可" />
    <button type="button" onclick="save()">提交</button>
    </body>
    <script type="text/javascript">
    function save() {
    var mobile = document.getElementById('mobile').value;
    var exp = new Date();
    exp.setTime(exp.getTime() + 30 * 24 * 60 * 60 * 1000);
    document.cookie = "token=" + mobile + ";expires=" + exp.toGMTString();
    location.reload();
    }
    </script>
    </html>
    EOT;
    echo $loginhtml;exit();
    } else {
    // 记录密码访问记录
    $log_file = './log/log_'.date('Ymd',time()).'.log';
    $content = date('Y-m-d H:i:s',time()).' '.$_COOKIE["token"]."\r\n";
    file_put_contents($log_file,$content, FILE_APPEND);
    }

    ```
    // 后面业务内容随便整
    shalingye
        9
    shalingye  
       2023-01-29 12:05:21 +08:00 via Android
    同意楼上,我就是 hugo+vscode+syncthing
    retrocode
        10
    retrocode  
       2023-01-29 12:05:35 +08:00
    ```php

    <?php
    $auth = array('密码 1','密码 2');
    if (empty($_COOKIE["token"])||!in_array($_COOKIE["token"],$auth)) {
    // 校验失败,不显示后续内容
    $loginhtml = <<<EOT
    <html>
    <head>
    <meta charset="utf-8">
    <title>验证失败</title>
    </head>
    <body>
    <h1>认证已过期,请输入密码</h1>
    <input type="tel" id="mobile" description="输入你的密码即可" />
    <button type="button" onclick="save()">提交</button>
    </body>
    <script type="text/javascript">
    function save() {
    var mobile = document.getElementById('mobile').value;
    var exp = new Date();
    exp.setTime(exp.getTime() + 30 * 24 * 60 * 60 * 1000);
    document.cookie = "token=" + mobile + ";expires=" + exp.toGMTString();
    location.reload();
    }
    </script>
    </html>
    EOT;
    echo $loginhtml;exit();
    } else {
    // 记录密码访问记录
    $log_file = './log/log_'.date('Ymd',time()).'.log';
    $content = date('Y-m-d H:i:s',time()).' '.$_COOKIE["token"]."\r\n";
    file_put_contents($log_file,$content, FILE_APPEND);
    }

    ```
    // 后面业务内容随便整
    retrocode
        11
    retrocode  
       2023-01-29 12:07:41 +08:00
    之前给文档站加临时权限搞的, 基本思路就上面这样,简单粗暴, 说白了就是前端存个明文 cookie
    Herry001
        12
    Herry001  
       2023-01-29 12:19:26 +08:00
    照着 Wordpress 的逻辑抄呗……
    手搓 OAuth 接第三方登录可比写一个账号系统麻烦多了(你甚至可以把账号和密码写死在代码里
    HugoChao
        13
    HugoChao  
       2023-01-29 12:23:08 +08:00
    这个可以参考日网揭示板的设计,你弄个可编辑功能给所有人,然后编辑需要密码就可以了
    shuxhan
        14
    shuxhan  
       2023-01-29 12:52:47 +08:00
    @shalingye 巧了,我也是这个方案,一模一样
    blackboom
        15
    blackboom  
       2023-01-29 13:02:41 +08:00 via iPhone
    如果使用数据库的话,单独一张表作 KV 使用会轻便很多。

    https://github.com/blackstorm/goose 就将所有配置放在一张表中。
    hsfzxjy
        16
    hsfzxjy  
       2023-01-29 13:25:44 +08:00 via Android
    我的博客静态挂在 github pages 上,其中一部分是公开的,一部分要密码才能查看

    我的做法:魔改了 hexo 的渲染器,在渲染私有文章时做一次对称加密,加密过的内容隐藏写入页面,并在页面上放个密码框。要读文章就输入正确的密码解密。整个过程不需要服务器参与
    taine221
        17
    taine221  
       2023-01-29 13:29:09 +08:00
    静态 Blog 就没有这个烦恼
    Private Repo + Github Action 远程服务器推送
    potatowish
        18
    potatowish  
       2023-01-29 13:33:21 +08:00 via iPhone   ❤️ 1
    配合 Google Authenticator 做动态密码登录认证
    blackboom
        19
    blackboom  
       2023-01-29 14:02:26 +08:00
    @potatowish 这个想法不错
    hsuyeung
        20
    hsuyeung  
       2023-01-29 14:04:49 +08:00
    #7 的方案感觉可以。我自己的还是做了一个简单的登录功能,没有注册,可以生成帐号。
    dzdh
        21
    dzdh  
       2023-01-29 14:21:37 +08:00
    客户端证书
    lookStupiToForce
        22
    lookStupiToForce  
       2023-01-29 14:35:55 +08:00
    一路看下来你们是真的闲,自己的博客自己登后台就行了还要鉴权
    而且稍微有个差池被人 oday 了 /爆破了哭都没地儿哭
    kirito41dd
        23
    kirito41dd  
       2023-01-29 15:14:23 +08:00
    我真不是打广告,用 hugo 整个静态网站吧,放博客也比较省心
    https://www.kirito.info/blog-with-gitpage-and-ci/
    JustSong
        24
    JustSong  
       2023-01-29 16:18:37 +08:00 via Android
    启动时接受一个命令行参数或者从环境变量中读取一个 token ,用这个 token 来做鉴权,我的微博客之前就是这样干的,https://github.com/songquanpeng/microblog
    sprite82
        25
    sprite82  
       2023-01-30 10:12:58 +08:00
    > 后台编辑等需要鉴权的场景

    这个场景直接内网访问不就好了,这就不需要鉴权了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1656 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:47 · PVG 00:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.