Discuz扩展:OAuth Provider模块
本帖最后由 hemingawa 于 2024-11-17 21:07 编辑这个插件用来为discuz添加oauth登录功能,允许其他应用接入你的discuz做授权登录。
安装方法:
将其中的auth目录放在discuz根目录下就行。
API信息:
授权端点:auth/oauth.php
Token端点:auth/token.php
用户信息端点:auth/whoami.php
代码:
OAuth.php 代码:
<?php
require_once '../source/class/class_core.php';
require_once '../source/function/function_home.php';
$discuz = C::app();
$discuz->init();
if($_G['uid'] == 0){
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
header("Location: https://discuz.openclipsis.top/member.php?mod=logging&action=login&referer=".urlencode($url));
}
// ClientID 是 SecretID 的md5哈希值
$client_id = isset($_REQUEST["client_id"])?$_REQUEST["client_id"]:"";
$state = isset($_REQUEST["state"])?$_REQUEST["state"]:"";
$redirect = isset($_REQUEST["redirect_uri"])?$_REQUEST["redirect_uri"]:"about:blank";
// 加签
$code = $_G['uid'].".".time().".".md5($_G['uid']."@".time()."@".$client_id);
if(strstr($redirect, '?') != false){
$authlink = $redirect."&state=".$state."&code=".$code;
}else{
$authlink = $redirect."?state=".$state."&code=".$code;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Authenticate</title>
</head>
<body>
警告:您正在将您的论坛账号授权给第三方!<br/>
Redirect URL:<?php echo $redirect;?><br/>
申请的权限:
<ul>
<li>读取您的账户基本信息</li>
</ul>
如果您信任该第三方,请点击:<a href="<?php echo $authlink;?>"><button>授权</button></a>
</body>
</html>
Token.php 代码:
<?php
if (!isset($_REQUEST["grant_type"])){
die("method err");
}
// Auth
if ($_REQUEST["grant_type"] == "authorization_code"){
if(!isset($_REQUEST["code"]) || !isset($_REQUEST["client_secret"])){
die("method err");
}
$client_id = md5($_REQUEST["client_secret"]);
$splitter = explode(".",$_REQUEST["code"]);
if(count($splitter) != 3){
die("code err");
}
$uid = (int)($splitter);
$time = (int)($splitter);
$sign = md5($uid."@".$time."@".$client_id);
if($sign != $splitter){
die("sig err");
}
if(time() - $time > 86400){
die("time expire");
}
$token = ($uid * 2 + 441)."-".time()."-".md5($uid."-".time()."sig");
die(json_encode(array(
"access_token"=>$token
)));
}
?>
Whoami.php 代码:
<?php
require_once '../config/config_ucenter.php';
require_once '../uc_client/client.php';
if(!isset($_REQUEST["access_token"])){
die("method err");
}
$waa = explode("-",$_REQUEST["access_token"]);
if(count($waa) != 3){
die("code err");
}
$at = $waa;
$uid = ((int)($at) - 441) / 2;
if(md5($uid."-".$waa."sig") != $waa){
die("sign err");
}
$time = $waa;
if(time() - $time > 86400){
die("login expired");
}
if($data = uc_get_user($uid,1)) {
list($uid, $username, $email) = $data;
} else {
die("not this user");
}
die(json_encode(array(
"id"=>(int)($uid),
"name"=>"w".substr(md5($uid."ppte2"),4,11),
"nickname"=>$username,
"avatar_url"=>UC_API."/avatar.php?uid=".$uid,
"url"=>"https://discuz.openclipsis.top/space-uid-".$uid.".html",
"html_url"=>"https://discuz.openclipsis.top/space-uid-".$uid.".html",
"email"=>$email
)));
?>
使用方法:
1,Client Key创建:
Client Secret可以自行任取,Client ID是Client Secret的MD5哈希值。
2,接入授权:
通过OAuth 2.0协议接入授权即可。
我试一试吧 请在帖子中粘贴部分核心代码
一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键代码和具体功能介绍【20220924强制执行】 感谢分享 苏紫方璇 发表于 2024-11-17 20:47
请在帖子中粘贴部分核心代码
一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键代码和具体 ...
已经把所有代码全粘贴到帖子里了awa
反正也没几行代码
页:
[1]