这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
3.1 KiB

import type {
OAuthTokenResult,
PasswordTokenRequestModel,
RefreshTokenRequestModel,
SignInRedirectResult,
TokenResult,
} from "#/account";
import requestClient from "../request";
/**
* 用户登录
* @param request 参数
* @returns 用户token
*/
export async function loginApi(request: PasswordTokenRequestModel): Promise<TokenResult> {
const clientId = import.meta.env.VITE_GLOB_CLIENT_ID;
const clientSecret = import.meta.env.VITE_GLOB_CLIENT_SECRET;
const scope = import.meta.env.VITE_GLOB_SCOPE;
const result = await requestClient.post<OAuthTokenResult>(
"/connect/token",
{
client_id: clientId,
client_secret: clientSecret,
grant_type: "password",
password: request.password,
scope: scope,
username: request.username,
},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
timeout: 30_000,
},
);
return {
accessToken: result.access_token,
expiresIn: result.expires_in,
refreshToken: result.refresh_token,
tokenType: result.token_type,
};
}
/**
* 刷新token
* @param request
* @returns
*/
export async function refreshToken(request: RefreshTokenRequestModel): Promise<TokenResult> {
const clientId = import.meta.env.VITE_GLOB_CLIENT_ID;
const clientSecret = import.meta.env.VITE_GLOB_CLIENT_SECRET;
const scope = import.meta.env.VITE_GLOB_SCOPE;
const result = await requestClient.post<OAuthTokenResult>(
"/connect/token",
{
client_id: clientId,
client_secret: clientSecret,
grant_type: "refresh_token",
refresh_token: request.refreshToken,
scope: scope,
},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
},
);
return {
accessToken: result.access_token,
expiresIn: result.expires_in,
refreshToken: result.refresh_token,
tokenType: result.token_type,
};
}
/**
* 刷新token
* @param request
* @returns
*/
export async function externalLoginApi(): Promise<TokenResult | SignInRedirectResult> {
const clientId = import.meta.env.VITE_GLOB_CLIENT_ID;
const clientSecret = import.meta.env.VITE_GLOB_CLIENT_SECRET;
const scope = import.meta.env.VITE_GLOB_SCOPE;
const registerAddress = import.meta.env.VITE_REGISTER_ADDRESS;
//import: https://stackoverflow.com/questions/61345366/axios-302-responses
const res = await fetch("/connect/token", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
credentials: "include", // 让请求带上 Cookie
body: new URLSearchParams({
client_id: clientId,
client_secret: clientSecret,
grant_type: "ExternalLogin",
scope: scope,
register_address: registerAddress,
}),
});
if (res.redirected) {
const redirectUrl = new URL(res.url);
const searchParams = new URLSearchParams(redirectUrl.search);
const isExternalLogin = searchParams.get("isExternalLogin") === "true";
const needRegister = searchParams.get("needRegister") === "true";
return {
isExternalLogin,
needRegister,
// redirectUrl //这个react项目这里不需要
};
}
const result = await res.json();
return {
accessToken: result.access_token,
expiresIn: result.expires_in,
refreshToken: result.refresh_token,
tokenType: result.token_type,
};
}