Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hexbee
Cloudreve
提交
2471dace
C
Cloudreve
项目概览
hexbee
/
Cloudreve
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Cloudreve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2471dace
编写于
3月 01, 2020
作者:
H
HFO4
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Feat: OneDrive OAuth
上级
c30c19ca
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
100 addition
and
2 deletion
+100
-2
routers/controllers/admin.go
routers/controllers/admin.go
+12
-1
routers/controllers/callback.go
routers/controllers/callback.go
+11
-0
routers/router.go
routers/router.go
+7
-0
service/admin/policy.go
service/admin/policy.go
+29
-1
service/callback/oauth.go
service/callback/oauth.go
+41
-0
未找到文件。
routers/controllers/admin.go
浏览文件 @
2471dace
...
...
@@ -184,7 +184,7 @@ func AdminAddCORS(c *gin.Context) {
}
}
// AdminAdd
CORS 创建跨域策略
// AdminAdd
SCF 创建回调函数
func
AdminAddSCF
(
c
*
gin
.
Context
)
{
var
service
admin
.
PolicyService
if
err
:=
c
.
ShouldBindJSON
(
&
service
);
err
==
nil
{
...
...
@@ -194,3 +194,14 @@ func AdminAddSCF(c *gin.Context) {
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
// AdminOneDriveOAuth 获取 OneDrive OAuth URL
func
AdminOneDriveOAuth
(
c
*
gin
.
Context
)
{
var
service
admin
.
PolicyService
if
err
:=
c
.
ShouldBindUri
(
&
service
);
err
==
nil
{
res
:=
service
.
GetOAuth
(
c
)
c
.
JSON
(
200
,
res
)
}
else
{
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
routers/controllers/callback.go
浏览文件 @
2471dace
...
...
@@ -77,6 +77,17 @@ func OneDriveCallback(c *gin.Context) {
}
}
// OneDriveOAuth OneDrive 授权回调
func
OneDriveOAuth
(
c
*
gin
.
Context
)
{
var
callbackBody
callback
.
OneDriveOauthService
if
err
:=
c
.
ShouldBindQuery
(
&
callbackBody
);
err
==
nil
{
res
:=
callbackBody
.
Auth
(
c
)
c
.
JSON
(
200
,
res
)
}
else
{
c
.
JSON
(
200
,
ErrorResponse
(
err
))
}
}
// COSCallback COS上传完成客户端回调
func
COSCallback
(
c
*
gin
.
Context
)
{
var
callbackBody
callback
.
COSCallback
...
...
routers/router.go
浏览文件 @
2471dace
...
...
@@ -220,6 +220,11 @@ func InitMasterRouter() *gin.Engine {
middleware
.
OneDriveCallbackAuth
(),
controllers
.
OneDriveCallback
,
)
// 文件上传完成
onedrive
.
GET
(
"auth"
,
controllers
.
OneDriveOAuth
,
)
}
// 腾讯云COS策略上传回调
callback
.
GET
(
...
...
@@ -338,6 +343,8 @@ func InitMasterRouter() *gin.Engine {
policy
.
POST
(
"cors"
,
controllers
.
AdminAddCORS
)
// 创建COS回调函数
policy
.
POST
(
"scf"
,
controllers
.
AdminAddSCF
)
// 获取 OneDrive OAuth URL
policy
.
GET
(
":id/oauth"
,
controllers
.
AdminOneDriveOAuth
)
}
}
...
...
service/admin/policy.go
浏览文件 @
2471dace
...
...
@@ -2,16 +2,20 @@ package admin
import
(
"bytes"
"context"
"encoding/json"
"fmt"
model
"github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/auth"
"github.com/HFO4/cloudreve/pkg/cache"
"github.com/HFO4/cloudreve/pkg/conf"
"github.com/HFO4/cloudreve/pkg/filesystem/driver/cos"
"github.com/HFO4/cloudreve/pkg/filesystem/driver/onedrive"
"github.com/HFO4/cloudreve/pkg/filesystem/driver/oss"
"github.com/HFO4/cloudreve/pkg/request"
"github.com/HFO4/cloudreve/pkg/serializer"
"github.com/HFO4/cloudreve/pkg/util"
"github.com/gin-gonic/gin"
cossdk
"github.com/tencentyun/cos-go-sdk-v5"
"net/http"
"net/url"
...
...
@@ -43,10 +47,34 @@ type AddPolicyService struct {
// PolicyService 存储策略ID服务
type
PolicyService
struct
{
ID
uint
`json:"id" binding:"required"`
ID
uint
`
uri:"id"
json:"id" binding:"required"`
Region
string
`json:"region"`
}
// GetOAuth 获取 OneDrive OAuth 地址
func
(
service
*
PolicyService
)
GetOAuth
(
c
*
gin
.
Context
)
serializer
.
Response
{
policy
,
err
:=
model
.
GetPolicyByID
(
service
.
ID
)
if
err
!=
nil
||
policy
.
Type
!=
"onedrive"
{
return
serializer
.
Err
(
serializer
.
CodeNotFound
,
"存储策略不存在"
,
nil
)
}
client
,
err
:=
onedrive
.
NewClient
(
&
policy
)
if
err
!=
nil
{
return
serializer
.
Err
(
serializer
.
CodeInternalSetting
,
"无法初始化 OneDrive 客户端"
,
err
)
}
util
.
SetSession
(
c
,
map
[
string
]
interface
{}{
"onedrive_oauth_policy"
:
policy
.
ID
,
})
cache
.
Deletes
([]
string
{
policy
.
BucketName
},
"onedrive_"
)
return
serializer
.
Response
{
Data
:
client
.
OAuthURL
(
context
.
Background
(),
[]
string
{
"offline_access"
,
"files.readwrite.all"
,
})}
}
// AddSCF 创建回调云函数
func
(
service
*
PolicyService
)
AddSCF
()
serializer
.
Response
{
policy
,
err
:=
model
.
GetPolicyByID
(
service
.
ID
)
...
...
service/callback/oauth.go
0 → 100644
浏览文件 @
2471dace
package
callback
import
(
"context"
model
"github.com/HFO4/cloudreve/models"
"github.com/HFO4/cloudreve/pkg/filesystem/driver/onedrive"
"github.com/HFO4/cloudreve/pkg/serializer"
"github.com/HFO4/cloudreve/pkg/util"
"github.com/gin-gonic/gin"
)
// OneDriveOauthService OneDrive 授权回调服务
type
OneDriveOauthService
struct
{
Code
string
`form:"code" binding:"required"`
}
// Auth 更新认证信息
func
(
service
*
OneDriveOauthService
)
Auth
(
c
*
gin
.
Context
)
serializer
.
Response
{
policyId
:=
util
.
GetSession
(
c
,
"onedrive_oauth_policy"
)
.
(
uint
)
policy
,
err
:=
model
.
GetPolicyByID
(
policyId
)
if
err
!=
nil
{
return
serializer
.
Err
(
serializer
.
CodeNotFound
,
"存储策略不存在"
,
nil
)
}
client
,
err
:=
onedrive
.
NewClient
(
&
policy
)
if
err
!=
nil
{
return
serializer
.
Err
(
serializer
.
CodeInternalSetting
,
"无法初始化 OneDrive 客户端"
,
err
)
}
credential
,
err
:=
client
.
ObtainToken
(
context
.
Background
(),
onedrive
.
WithCode
(
service
.
Code
))
if
err
!=
nil
{
return
serializer
.
Err
(
serializer
.
CodeInternalSetting
,
"AccessToken 获取失败"
,
err
)
}
// 更新存储策略的 RefreshToken
if
err
:=
client
.
Policy
.
UpdateAccessKey
(
credential
.
RefreshToken
);
err
!=
nil
{
return
serializer
.
DBErr
(
"无法更新 RefreshToken"
,
err
)
}
return
serializer
.
Response
{}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录