ASTRO轻应用 ASTROZERO-如何集成第三方账号登录:单点登录(“CAS”协议)认证

时间:2024-04-26 09:15:06

单点登录(“CAS”协议)认证

单点登录认证是让AstroZero作为客户端,第三方进行cas鉴权作为服务端的认证方式。当AstroZero作为客户端时,第三方账号通过cas鉴权获得ticket,第三方账号携带ticket重定向到AstroZero,AstroZero后台获取ticket后到CAS Server校验ticket合法性,ticket合法性验证成功后AstroZero返回access-token给第三方账号供第三方账号访问AstroZero。

AstroZero作为客户端获取到ticket后,提供了sso快捷校验ticket合法性方法。使用sso对ticket进行验证样例代码如下:

import * as user from 'user';
import * as sys from 'sys';
import * as sso from 'sso'; //使用sso单点登录需要引用

//输入参数
@action.object({type: "param"}) 
export class MyObject {
    @action.param({type: 'String'})
    ticket: string;  //第三方进行cas鉴权时得到的ticket
    @action.param({type: 'string'})
    service: string; //第三方提供的service
}

//输出参数
@action.object({type: "param"}) 
export class Output {
    @action.param({type: 'String'})
    username: string; //返回的用户名
    @action.param({type: 'String'})
    token: string;    //返回的Access-token
}

//sso登录逻辑
@action.object({type: "method"})
export class ActionDemo { 
@action.method({ label: 'greeting something', description: 'greeting something.', input: 'MyObject', output: 'Output' })
    public greet(inarg: MyObject): Output {
        console.log(inarg.ticket);
        let ticket = inarg.ticket;
        let service = inarg.service;
	//cas服务的域名
        let casUrl = "http://10.70.67.246:8899/cas"			
	//根据传入的service和ticket使用sso去cas校验ticket的合法性并返回用户信息
        let cli = sso.newClientWithCas(service, ticket, casUrl);
        let a = cli.validateTicket();
        console.log(a);
        let out = new Output();
        out.username = a;
        //检测user是否存在
        createUser(out.username);
	//sso进行登录验证并返回 access-token
        let token = cli.login();
        out.token = token;
        return out;
    }
}

//检测user是否存在逻辑
function createUser(username: string) {
    try{
        let u = {
        "userName": username,
        "name": username,
        "email": username,
        "languageLocaleKey": "zh_CN",
        "timeZoneSidKey": "10",
        "profile": "000T0000000000000002",
    }
    let id = user.createInnerUser(u)
    console.log(id)
    }catch(e) {
        console.log(e)
    }
}
support.huaweicloud.com/bestpractice-astrozero/astrozero_bestpractice_0007.html