805 字
4 分钟
使用 Graph SDK 获取 OneDrive 自定义年限 Client Secret 的 API
前言
通常情况下,我们都是直接在 Microsoft Azure 应用注册页面创建 OneDrive API。但是,通过网页界面创建的 API 密钥(Client Secret)最长有效期仅为 两年。
如果是作为长期运行的服务(如 NAS 挂载、自动备份等),两年一换难免会因为忘记更新密钥而导致服务不可用。通过使用 Microsoft Graph PowerShell SDK,我们可以突破这个限制,自定义密钥的有效期(例如设置为 100 年),从而实现“永久”使用。
1. 安装 Graph SDK
首先,需要在 PowerShell 中安装 Microsoft Graph 模块。请以管理员身份或当前用户身份运行 PowerShell 并执行以下命令:
Install-Module Microsoft.Graph -Scope CurrentUser -Force -AllowClobber2. 登录账号并获取权限
安装完成后,需要登录你的微软账号并授予必要的权限以便通过命令行管理应用。
执行以下命令:
Connect-MgGraph -Scopes "Application.ReadWrite.All", "AppRoleAssignment.ReadWrite.All", "Directory.ReadWrite.All"
# 获取 Microsoft Graph 的服务主体引用$graphSp = Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Graph'"注意:执行
Connect-MgGraph后会弹出浏览器窗口,请登录你需要创建应用的微软账号并同意授权。
3. 配置并创建应用
这是核心步骤。你可以根据需要修改下方的配置变量(如应用名称、密钥名称、有效期等)。将以下脚本复制到 PowerShell 中运行即可。
配置参数
# === 基础配置 ===$displayName = "rclone" # 注册应用服务名称$secretDisplayName = "rclone-secret" # 密钥名称$secretValidityYears = 100 # 期限,这里设置 100 年$redirectUri = "http://localhost" # 重定向 URI$signInAudience = "AzureADandPersonalMicrosoftAccount" # 受支持的帐户类型(个人+组织)
# === 权限定义 ===# 委托权限 (Delegated Permissions)$delegatedPermissions = @("User.Read", "Files.Read", "Files.ReadWrite", "offline_access")# 应用程序权限 (Application Permissions)$appPermissions = @("Files.Read.All", "Files.ReadWrite.All")执行创建逻辑
# === 查找权限 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
# === 创建客户端密码凭据 (Client Secret) ===$startDate = Get-Date$endDate = $startDate.AddYears($secretValidityYears)
$secret = Add-MgApplicationPassword -ApplicationId $app.Id -PasswordCredential @{ DisplayName = $secretDisplayName StartDateTime = $startDate EndDateTime = $endDate}
# === 输出结果 ===Write-Host "------------------------------------------------" -ForegroundColor GreenWrite-Host "应用创建成功!" -ForegroundColor GreenWrite-Host "应用名称 (Name): $displayName"Write-Host "Application (client) ID: $($app.AppId)"Write-Host "Client Secret: $($secret.SecretText)"Write-Host "------------------------------------------------" -ForegroundColor GreenWrite-Host "请立即保存 Client Secret,它只显示一次。" -ForegroundColor Yellow4. 结语
执行完上述脚本后,不出意外你应该已经成功获取到了 Client ID 和 Client Secret。
- Client ID: 用于标识你的应用。
- Client Secret: 有效期为你设置的年限(如 100 年)。
如何切换账号?
如果你想为另一个账号创建 API,需要先注销当前登录,然后重复上述步骤:
# 注销当前登录Disconnect-MgGraph之后再次运行 Connect-MgGraph 即可登录新账号。
使用 Graph SDK 获取 OneDrive 自定义年限 Client Secret 的 API
https://blog.gckjoy.com/archives/onedrive-api/