logo NodeSeekbeta

通过在请求头添加 FedAuth Cookie 来继续保持以 WebDAV 方式挂载 SharePoint / OneDrive 的持久可用性

前言见微软 SharePoint 更新认证方式导致以 WebDAV 方式的挂载出现 403 授权错误

由于微软弃用 RPS,导致无法更新 FedAuth Cookie,因此无法保持 WebDAV 挂载的持久可用性。

那么现在可以通过手动添加 FedAuth Cookie 到请求头来完成挂载。这个 cookie 的有效期只有 5 天,到期后需要刷新。

以 Rclone 为例

这是 RPS 更新 Cookie 的配置示例

[sharepoint]
type = webdav
url = https://example-my.sharepoint.com/personal/my_account_example_edu/Documents
vendor = sharepoint
user = [email protected]
pass = ef2KyNf2WMrVGcVCroGEiw-kCKeh75XdKcE

RPS 失效后,需要自己添加 FedAuth Cookie,于是配置变成

[sharepoint]
type = webdav
url = https://example-my.sharepoint.com/personal/my_account_example_edu/Documents
vendor = other
user = [email protected]
pass = ef2KyNf2WMrVGcVCroGEiw-kCKeh75XdKcE
headers = "Cookie","FedAuth=XXX;rtFa=XXX;"

修改的地方有2处,vendor 改为 other,添加 Cookie 的请求头,只需要2项,FedAuthrtFa

Cookie 可以在 OneDrive 页面获取

自动更新 Cookie

现在需要另外实现一套更新 Cookie 的方案,不过我没有好的思路,可能还是需要软件内置这种更新逻辑会更好,自己去更新配置文件还是太麻烦了。

有大神去给rclone提PR来替代RPS的更新Cookie的方案吗?

参考

https://forum.rclone.org/t/handle-403-error-due-to-expired-external-cookies-when-using-webdav-with-onedrive-business-sharepoint/49900

https://gist.github.com/ozel/bb1cbdd4674445aba1c25289166afda3

  • 大佬,牛逼啊。用这个方式rclone 挂载成功了 ,怎么通过alist挂载呢

  • 鸡腿支持一下 xhj016

  • @夜听风雨 #1 我刚才发现了一个其他方式挂载的项目 https://github.com/nickfox-taterli/rclone

    你可以也试一下,不是 webdav 的方式的,可能会更好用点,只是项目很久没更新了,不清楚还能不能用

    openlist需要别人来研究了,我只通过rclone挂载无api的sharepoint

  • 有办法自动延长有效期么?

  • cookie 更新方案
    适合 mac 和 linux 环境,windows 需要自行做对应调整

    需要用到一个 go 的 浏览器 cookie 读取库,https://github.com/browserutils/kooky
    把下面内容保存成 cookie.go

    package main
    
    import (
        "fmt"
        "context"
    
        "github.com/browserutils/kooky"
        _ "github.com/browserutils/kooky/browser/all" // register cookie store finders!
    )
    
    func main() {
        // uses registered finders to find cookie store files in default locations
        // applies the passed filters "Valid", "DomainHasSuffix()" and "Name()" in order to the cookies
        cookiesSeq := kooky.TraverseCookies(context.TODO(), kooky.Valid, kooky.DomainHasSuffix(`google.com`), kooky.Name(`NID`)).OnlyCookies()
    
        for cookie := range cookiesSeq {
            fmt.Println(cookie.Domain, cookie.Name, cookie.Value)
        }
     }
    

    再运行代码完成编译
    go mod init cookie && go mod tidy && go build cookie.go

    运行 ./cookie 按提示授权后即可读取所有浏览器的 cookie

    最后来个更新脚本
    update-cookie.sh

    #!/bin/bash
    
    set -e -u
    
    SRC_DIR=$(dirname "$(readlink -f "$0")")
    config_file=~/.config/rclone/rclone.conf
    
    cd "$SRC_DIR"
    
    
    new_cookie=$(./cookie | grep sharepoin | grep -P 'rtFa=|FedAuth=' | awk '{s=s" "$1} END{print s}')
    sed "s/Cookie\x22,\x22[^\x22]\+/Cookie\x22,\x22$new_cookie/" $config_file
    

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有64931位seeker

🎉欢迎新用户🎉