SDK 与代码示例

本文档提供多种编程语言的接入示例代码,帮助开发者快速完成墨觉互联 OAuth2 接入。

通用配置:以下示例中,BASE_URL 为墨觉互联平台地址,CLIENT_ID 为您的 AppID,CLIENT_SECRET 为您的 AppSecret,REDIRECT_URI 为您的回调地址。请根据实际情况替换。

1. PHP 示例

使用原生 PHP cURL 扩展完成 OAuth2 授权流程。

第一步:生成授权链接

 $clientId,
    'redirect_uri' => $redirectUri,
    'response_type' => 'code',
    'state' => $state,
    'scope' => $scope,
]);

// 引导用户访问授权链接
header('Location: ' . $authUrl);
exit;
?>

第二步:回调处理(callback.php)

 true,
    CURLOPT_POSTFIELDS => http_build_query([
        'grant_type' => 'authorization_code',
        'client_id' => $clientId,
        'client_secret' => $clientSecret,
        'code' => $code,
        'redirect_uri' => $redirectUri,
    ]),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
$tokenData = json_decode($response, true);

if (isset($tokenData['error'])) {
    die('获取令牌失败:' . $tokenData['error_description']);
}

$accessToken = $tokenData['access_token'];
$refreshToken = $tokenData['refresh_token'];

// 4. 获取用户信息
$ch = curl_init($baseUrl . '/oauth/userinfo.php');
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $accessToken],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => true,
]);
$userResponse = curl_exec($ch);
curl_close($ch);
$userInfo = json_decode($userResponse, true);

// 5. 处理用户信息(如创建/登录用户)
echo '登录成功!';
echo '
';
print_r($userInfo);
echo '
'; ?>

刷新令牌

 true,
        CURLOPT_POSTFIELDS => http_build_query([
            'grant_type' => 'refresh_token',
            'client_id' => 'YOUR_APP_ID',
            'client_secret' => 'YOUR_APP_SECRET',
            'refresh_token' => $refreshToken,
        ]),
        CURLOPT_RETURNTRANSFER => true,
    ]);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}
?>

2. cURL 命令行示例

使用 cURL 命令行工具测试接口。

用授权码换取令牌

curl -X POST http://auth.mojue88.com/oauth/token.php \
  -d "grant_type=authorization_code" \
  -d "client_id=YOUR_APP_ID" \
  -d "client_secret=YOUR_APP_SECRET" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://your-domain.com/callback"

刷新令牌

curl -X POST http://auth.mojue88.com/oauth/token.php \
  -d "grant_type=refresh_token" \
  -d "client_id=YOUR_APP_ID" \
  -d "client_secret=YOUR_APP_SECRET" \
  -d "refresh_token=YOUR_REFRESH_TOKEN"

获取用户信息

curl -X GET http://auth.mojue88.com/oauth/userinfo.php \
  -H "Authorization: Bearer ACCESS_TOKEN"

3. Python 示例

使用 Python requests 库完成 OAuth2 授权流程。

完整流程示例

import requests
import urllib.parse
import secrets
from flask import Flask, request, redirect, session

app = Flask(__name__)
app.secret_key = 'your-secret-key'

BASE_URL = 'http://auth.mojue88.com'
CLIENT_ID = 'YOUR_APP_ID'
CLIENT_SECRET = 'YOUR_APP_SECRET'
REDIRECT_URI = 'http://localhost:5000/callback'

@app.route('/login')
def login():
    state = secrets.token_hex(16)
    session['oauth_state'] = state
    params = {
        'client_id': CLIENT_ID,
        'redirect_uri': REDIRECT_URI,
        'response_type': 'code',
        'state': state,
        'scope': 'basic',
    }
    auth_url = f"{BASE_URL}/oauth/authorize.php?{urllib.parse.urlencode(params)}"
    return redirect(auth_url)

@app.route('/callback')
def callback():
    # 校验state
    if request.args.get('state') != session.get('oauth_state'):
        return 'State验证失败', 400

    if 'error' in request.args:
        return f"授权失败:{request.args['error']}"

    code = request.args.get('code')

    # 换取access_token
    token_resp = requests.post(f"{BASE_URL}/oauth/token.php", data={
        'grant_type': 'authorization_code',
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'code': code,
        'redirect_uri': REDIRECT_URI,
    })
    token_data = token_resp.json()

    if 'error' in token_data:
        return f"获取令牌失败:{token_data.get('error_description', token_data['error'])}"

    access_token = token_data['access_token']

    # 获取用户信息
    user_resp = requests.get(f"{BASE_URL}/oauth/userinfo.php", headers={
        'Authorization': f'Bearer {access_token}',
    })
    user_info = user_resp.json()

    return f"登录成功!用户信息:{user_info}"

if __name__ == '__main__':
    app.run(debug=True)

4. Node.js 示例

使用 Node.js + Express + axios 完成 OAuth2 授权流程。

完整流程示例

const express = require('express');
const axios = require('axios');
const crypto = require('crypto');
const session = require('express-session');

const app = express();
app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true }));

const BASE_URL = 'http://auth.mojue88.com';
const CLIENT_ID = 'YOUR_APP_ID';
const CLIENT_SECRET = 'YOUR_APP_SECRET';
const REDIRECT_URI = 'http://localhost:3000/callback';

// 登录入口
app.get('/login', (req, res) => {
    const state = crypto.randomBytes(16).toString('hex');
    req.session.oauthState = state;
    const params = new URLSearchParams({
        client_id: CLIENT_ID,
        redirect_uri: REDIRECT_URI,
        response_type: 'code',
        state: state,
        scope: 'basic',
    });
    res.redirect(`${BASE_URL}/oauth/authorize.php?${params}`);
});

// 回调处理
app.get('/callback', async (req, res) => {
    try {
        // 校验state
        if (req.query.state !== req.session.oauthState) {
            return res.status(400).send('State验证失败');
        }

        if (req.query.error) {
            return res.send(`授权失败:${req.query.error}`);
        }

        const code = req.query.code;

        // 换取access_token
        const tokenResp = await axios.post(`${BASE_URL}/oauth/token.php`, new URLSearchParams({
            grant_type: 'authorization_code',
            client_id: CLIENT_ID,
            client_secret: CLIENT_SECRET,
            code: code,
            redirect_uri: REDIRECT_URI,
        }));

        const tokenData = tokenResp.data;
        if (tokenData.error) {
            return res.send(`获取令牌失败:${tokenData.error_description || tokenData.error}`);
        }

        const accessToken = tokenData.access_token;

        // 获取用户信息
        const userResp = await axios.get(`${BASE_URL}/oauth/userinfo.php`, {
            headers: { Authorization: `Bearer ${accessToken}` },
        });

        res.json({ message: '登录成功', user: userResp.data });
    } catch (error) {
        res.status(500).send('服务器错误:' + error.message);
    }
});

app.listen(3000, () => {
    console.log('Server running on http://localhost:3000');
});

5. Java 示例(可选)

使用 Java HttpURLConnection 完成授权码换取令牌。

import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class MojueOAuth {
    private static final String BASE_URL = "http://auth.mojue88.com";
    private static final String CLIENT_ID = "YOUR_APP_ID";
    private static final String CLIENT_SECRET = "YOUR_APP_SECRET";

    public static String getAccessToken(String code, String redirectUri) throws Exception {
        String params = String.format(
            "grant_type=authorization_code&client_id=%s&client_secret=%s&code=%s&redirect_uri=%s",
            URLEncoder.encode(CLIENT_ID, StandardCharsets.UTF_8),
            URLEncoder.encode(CLIENT_SECRET, StandardCharsets.UTF_8),
            URLEncoder.encode(code, StandardCharsets.UTF_8),
            URLEncoder.encode(redirectUri, StandardCharsets.UTF_8)
        );

        URL url = new URL(BASE_URL + "/oauth/token.php");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        try (OutputStream os = conn.getOutputStream()) {
            os.write(params.getBytes(StandardCharsets.UTF_8));
        }

        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                response.append(line);
            }
            return response.toString(); // JSON字符串
        }
    }
}
提示:以上示例代码仅供参考,实际使用时请根据您的项目架构进行调整。如有疑问,请参考 API详细文档常见问题