文章

使用 Graph SDK 获取 OneDrive 自定义年限 Client secret 的 API

前言

想必大伙都撸到 E3 了吧,将 5T 的 OneDrive 挂载到 vps 上或本地可能是一部人的使用需求,但在 Azure 中申请的 Client secret 最多就两年的期限,而 Graph SDK 创建的可以自定义期限。

教程

以下所有命令均在在 PowerShell 执行。

安装 Graph SDK

1
Install-Module Microsoft.Graph -Scope CurrentUser -Force -AllowClobber

登录账号

登录账号并获取服务,此处会弹窗登录,第一次建议用管理员账号登录给授权,不然子账号没法登录使用程序:

1
2
3
Connect-MgGraph -Scopes "Application.ReadWrite.All", "AppRoleAssignment.ReadWrite.All", "Directory.ReadWrite.All"

$graphSp = Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Graph'"

fMHBgBsWHWO81HeznoZRL2en8Kq1p0vt.webp

 

配置服务

1
2
3
4
5
6
7
8
9
10
$displayName = "rclone"    # 注册应用服务名称,可自定义
$secretDisplayName = "rclone-secret"    # 密钥名称,可自定义
$secretValidityYears = 100    # 期限,这里设置 100 年,可自定义
$redirectUri = "http://localhost"    # 重定向 URI,具体看使用的程序的说明,如果是 rclone 就不用修改
$signInAudience = "AzureADandPersonalMicrosoftAccount"    # 受支持的帐户类型,如果你不知道用来做什么,就不用修改

# === 权限定义 ===
# 基本的读写权限,如有其他需求可自行修改
$delegatedPermissions = @("User.Read", "Files.Read", "Files.ReadWrite", "offline_access")
$appPermissions = @("Files.Read.All", "Files.ReadWrite.All")

创建应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# === 查找权限 ID ===
$requiredDelegatedScopes = $graphSp.Oauth2PermissionScopes | Where-Object { $delegatedPermissions -contains $_.Value }
$requiredAppRoles = $graphSp.AppRoles | Where-Object { $appPermissions -contains $_.Value }

# === 构建权限结构 ===
$resourceAccessList = @()

$requiredDelegatedScopes | ForEach-Object {
    $resourceAccessList += @{
        Id = $_.Id
        Type = "Scope"
    }
}

$requiredAppRoles | ForEach-Object {
    $resourceAccessList += @{
        Id = $_.Id
        Type = "Role"
    }
}

$requiredResourceAccess = @(
    @{
        ResourceAppId = $graphSp.AppId
        ResourceAccess = $resourceAccessList
    }
)

# === 设置重定向 URI ===
$webRedirectUris = @($redirectUri)

# === 创建应用程序 ===
$app = New-MgApplication -DisplayName $displayName `
    -SignInAudience $signInAudience `
    -Web @{ RedirectUris = $webRedirectUris } `
    -RequiredResourceAccess $requiredResourceAccess

# === 创建服务主体 ===
$sp = New-MgServicePrincipal -AppId $app.AppId

# === 创建客户端密码凭据 ===
$startDate = Get-Date
$endDate = $startDate.AddYears($secretValidityYears)

$secret = Add-MgApplicationPassword -ApplicationId $app.Id -PasswordCredential @{
    DisplayName = $secretDisplayName
    StartDateTime = $startDate
    EndDateTime = $endDate
}

# === 输出信息 ===
Write-Host "应用名称: $displayName"
Write-Host "Application (client) ID: $($app.AppId)"
Write-Host "Client Secret: $($secret.SecretText)"

至此,不出意外就成功获取到 Client ID 和 Client secret 了。如想获取下一个账号的,则用 Disconnect-MgGraph 命令注销登录再重复上面步骤即可。

本文由作者按照 CC BY 4.0 进行授权