githubの不正アクセスのチュートリアルとどのように第三者を設計するためには、ユーザーのログインテーブルを認可しました

レンダリング

要件:ユーザー登録にサイト上の記事、レビュー記事を確認し、ログインし、そこから取り出し、その後どのようにこの厄介なステップにしたいですか?答えは、第三者がログインを許可することです。この記事では、githubのは、チュートリアルのログインを許可説明することです。

経験住所の効果:http://biaochenxuying.cn

1. githubの第三者がチュートリアルをログに記録する権限

githubのを初めて目には、フルフロー・チャート1を承認しました:

githubの1

または完全な承認はgithubのスキーム2を見て:

githubの2

1.1のOAuthアプリケーションを適用

まず、次の手順を実行し、OAuthのアプリケーションに適用されますgithubの上でログインする必要があります。

  1. githubのログイン
  2. >開発者の設定新しいOAuthのアプリケーションの右側 - 絵の下に設定]をクリックします
  3. アプリケーションのアプリの設定を記入し、二つの重要な設定項目があります
  4. ホームページのURLこれは、認証URLを必要とし、あなたのプロジェクトのルートディレクトリのアドレスということを理解することができ、フォローアップです
  5. コールバックアドレスは認証コールバックURL承認を使用すると、認証コードコールバックアドレスを取得するために、これは、これは非常に重要です、成功しています。

次のように具体的な実践は、以下のとおりです。

    1. まず、あなたGitHubのアカウントにログインし、[設定]を入力します。

    1. OAuthのアプリをクリックして、新しいアプリケーションや新しいOAuthのアプリケーションを登録します。

    1. 情報を入力します。

image.png

    1. アプリケーション情報は、以下に説明します。

-プロセスは、公式文書GitHubのセットを参照することができOAuthのアプリを登録します

1.2認証ログイン

githubの文档:建物のOAuth-アプリケーション/許可-のOAuth-アプリケーション

認証でログインするための3つの主要なステップ:

第二工程及び第三工程は、インタフェースの第二の側面は、このパラメータをClient_secret必要があるため、後端に実現され、第一されている間、この練習の著者は、前後の使用は、フロントエンドで実装プロジェクト別、最初のステップを終了します情報への3段階のユーザアクセスは、バックエンドデータベースに格納されています。

1.3コードの実装

1.3.1フロントエンド

プロジェクトの著者は、技術的に反応しています。

// config.js

// ***** 处请填写你申请的 OAuth App 的真实内容
 const config = {
  'oauth_uri': 'https://github.com/login/oauth/authorize',
  'redirect_uri': 'http://biaochenxuying.cn/',
  'client_id': '*****',
  'client_secret': '*******',
};

// 本地开发环境下
if (process.env.NODE_ENV === 'development') {
  config.redirect_uri = "http://localhost:3001/"
  config.client_id = "******"
  config.client_secret = "*****"
}
export default config; 

コード参照config.jsの

REDIRECT_URIコールバックアドレスは、分割された環境なので、私は2つのOAuthアプリケーション、ローカルの開発環境のためのオンライン本番環境のための1つを構築しました。

一般的には、ログインページには、各ルーティング/ログインに対応し、独立していなければならないが、このプロジェクトは、ログインコンポーネントサブアセンブリの構成部品をログインすることですNAV、NAVは、グローバルなコンポーネントであるため、コールバックアドレスを書くことにhttp:// biaochenxuying.cn/

  • だから、ジャンプが内部login.jsで書かれているクリックしてください。
  • フィニッシュ後nav.jsで書かれている認証コードを取得するには
  • コード値のバックエンドインターフェイスを取得するためのnav.js要求は、バックエンドのインターフェイスは、ユーザーに関する情報を戻します。
  • ユーザ情報githubのを取得するために取らaccess_tokenは、前記リアコードの端部だけでなく、githubのaccess_tokenはテイクを得るためには、次に記載の方法。
// login.js

// html
<Button
    style={{ width: '100%' }}
    onClick={this.handleOAuth} >
      github 授权登录
</Button>

// js
handleOAuth(){
    // 保存授权前的页面链接
    window.localStorage.preventHref = window.location.href
    // window.location.href = 'https://github.com/login/oauth/authorize?client_id=***&redirect_uri=http://biaochenxuying.cn/'
    window.location.href = `${config.oauth_uri}?client_id=${config.client_id}&redirect_uri=${config.redirect_uri}`
}

コード参照login.js

// nav.js

componentDidMount() {
    // console.log('code :', getQueryStringByName('code'));
    const code = getQueryStringByName('code')
    if (code) {
      this.setState(
        {
          code
        },
        () => {
          if (!this.state.code) {
            return;
          }
          this.getUser(this.state.code);
        },
      );
    }
  }

componentWillReceiveProps(nextProps) {
    const code = getQueryStringByName('code')
    if (code) {
      this.setState(
        {
          code
        },
        () => {
          if (!this.state.code) {
            return;
          }
          this.getUser(this.state.code);
        },
      );
    }
  }
  getUser(code) {
    https
      .post(
        urls.getUser,
        {
          code,
        },
        { withCredentials: true },
      )
      .then(res => {
        // console.log('res :', res.data);
        if (res.status === 200 && res.data.code === 0) {
          this.props.loginSuccess(res.data);
          let userInfo = {
            _id: res.data.data._id,
            name: res.data.data.name,
          };
          window.sessionStorage.userInfo = JSON.stringify(userInfo);
          message.success(res.data.message, 1);
          this.handleLoginCancel();
          // 跳转到之前授权前的页面
          const href = window.localStorage.preventHref
          if(href){
            window.location.href = href 
          }
        } else {
          this.props.loginFailure(res.data.message);
          message.error(res.data.message, 1);
        }
      })
      .catch(err => {
        console.log(err);
      });
  }

参考nav.js

1.3.2バックエンド

プロジェクトで使用されるバックエンド技術は、著者のNode.jsと急行です。

  • フロントエンド後端部には、コードを送信しますが、また、情報のgithubのに従って、access_tokenはを取得するには、その後、githubのaccess_tokenは取るユーザーを取ります。
  • そして、途中でデータベースに保存されているユーザ登録情報を使用して、フロントエンドユーザー情報に戻ります。
// app.config.js

exports.GITHUB = {
    oauth_uri: 'https://github.com/login/oauth/authorize',
    access_token_url: 'https://github.com/login/oauth/access_token',
    // 获取 github 用户信息 url // eg: https://api.github.com/user?access_token=******&scope=&token_type=bearer
    user_url: 'https://api.github.com/user',

    // 生产环境
    redirect_uri: 'http://biaochenxuying.cn/',
    client_id: '*****',
    client_secret: '*****',

    // // 开发环境
    // redirect_uri: "http://localhost:3001/",
    // client_id: "*****",
    // client_secret: "*****",
};

コード参照app.config.js

// 路由文件  user.js

const fetch = require('node-fetch');
const CONFIG = require('../app.config.js');
const User = require('../models/user');

// 第三方授权登录的用户信息
exports.getUser = (req, res) => {
  let { code } = req.body;
  if (!code) {
    responseClient(res, 400, 2, 'code 缺失');
    return;
  }
  let path = CONFIG.GITHUB.access_token_url;
  const params = {
    client_id: CONFIG.GITHUB.client_id,
    client_secret: CONFIG.GITHUB.client_secret,
    code: code,
  };
  // console.log(code);
  fetch(path, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json', 
    },
    body: JSON.stringify(params),
  })
    .then(res1 => {
      return res1.text();
    })
    .then(body => {
      const args = body.split('&');
      let arg = args[0].split('=');
      const access_token = arg[1];
      // console.log("body:",body);
      console.log('access_token:', access_token);
      return access_token;
    })
    .then(async token => {
      const url = CONFIG.GITHUB.user_url + '?access_token=' + token;
      console.log('url:', url);
      await fetch(url)
        .then(res2 => {
          console.log('res2 :', res2);
          return res2.json();
        })
        .then(response => {
          console.log('response ', response);
          if (response.id) {
            //验证用户是否已经在数据库中
            User.findOne({ github_id: response.id })
              .then(userInfo => {
                // console.log('userInfo :', userInfo);
                if (userInfo) {
                  //登录成功后设置session
                  req.session.userInfo = userInfo;
                  responseClient(res, 200, 0, '授权登录成功', userInfo);
                } else {
                  let obj = {
                    github_id: response.id,
                    email: response.email,
                    password: response.login,
                    type: 2,
                    avatar: response.avatar_url,
                    name: response.login,
                    location: response.location,
                  };
                  //注册到数据库
                  let user = new User(obj);
                  user.save().then(data => {
                    // console.log('data :', data);
                    req.session.userInfo = data;
                    responseClient(res, 200, 0, '授权登录成功', data);
                  });
                }
              })
              .catch(err => {
                responseClient(res);
                return;
              });
          } else {
            responseClient(res, 400, 1, '授权登录失败', response);
          }
        });
    })
    .catch(e => {
      console.log('e:', e);
    });
};

コード参照user.jsの

githubの上の情報を取得するために、ユーザ、およびユーザテーブルに登録された、または別のOAuthマッピングテーブルを保存しているとして、あなたは自分のプロジェクトの状況を見ています。

以下に示すようにgithubのは、ユーザーからの情報を取得します:

githubの-login.png

正味の効果:

githubの-logining.gif

記事を参加:

  1. https://www.jianshu.com/p/a9c0b277a3b3

  2. https://blog.csdn.net/zhuming3834/article/details/77649960

2.第三者認証されたユーザのログインテーブルを設計する方法

第三者ユーザ情報のサードパーティの不正アクセスは、元のユーザー・データベース・テーブルまたは新しいテーブルに保管されている場合?

回答:これは、特定のプロジェクトに依存し、実践の様々な、以下を参照してください。

サードパーティがログオンすることを許可した後、サードパーティのユーザー情報が正常にのみ、具体的githubのは、IDなどの、第三者で何を見て、OpenIDのかunionidまたはIDサインインし、ユーザーに返されます

  • 1.登録の仕方によって直接データベースに保存します

最初:サイトがあれば許可に成功した後、直接、第3のユーザ情報への第三者による登録機能を直接不正アクセス、登録内のユーザーに、独自のデータベーステーブルを保存しました。典型的な例は、不正アクセスのマイクロチャネルパブリック数です。

第二は:サイトが場合がある登録機能を認証が成功した後、あなたもあなたも直接第3のユーザ情報にすることができ、認定された第三者経由でログインすることができ、登録、独自のデータベース内のユーザーテーブルに保存された(ただし、バックエンドのコードを自動的に生成されますユーザーは、知らないだけで、第三者でログオンすることを許可することができます)、同じテーブルで、このユーザーとネイティブの登録ユーザ情報などの第三者を、そしてこのような状況は、自分のプロジェクトの特定の状況に依存します。一時的にこのアプローチの使用上のブログサイトの作者。

  • 2.マップを増やします

現実には、多くのサイトは、登録IDは、ウェブサイトを訪問使用するなど、複数のアカウントのログインを持って、あなたはまた、携帯電話番号を使用してログオンすることができます、あなたはQQとし、その上でログインすることができます。データベースのマッピング関係、QQ、電話番号などの登録IDサイトにマッピングされているがあります。それを確実にするためにどんな方法でログイン、ちょうどマッピング関係を確認するために、マッピングが成功したログインIDを聞かせてIDが登録ウェブサイト上で発見されませんでした。

  • 3.記録されたユーザー・レジストリーIDに対応する、OAuthのテーブル、列IDを作成

OAuthのサードパーティのログインOpenIDのを記録し、その後、あなたはどのように作成するか、多くの列、サードパーティ製のサインオン機能の数を持って、列ID、ユーザー・レジストリーに対応するIDのレコードをテーブルを構築するには、インターフェイスを返され、第三者に着陸する際、によってこのレコードIDテーブルOpenIDが存在する場合、IDは、レジストリを読み、関連する情報のセッションを記録し、情報を入手します。これは、/ユーザーログインをリダイレクトopenidのバインドをサイト登録アカウントを入力するか、新たに登録されたアカウント情報をバインドするユーザーのためのインターフェイスを登録存在しません。

具体的なコーディングプラクティスは、記事を参照してください。

ユーザ情報テーブルの設計1.ログイン

ユーザーデータベーステーブルの構造設計、サードパーティのログイン2.

4.最後に

githubのブログアドレスの著者:githubの

あなたはあなたを助けるために、この記事や良いを見つけた場合、私に星や詠唱賞賛を与える、あなたのポイントを称賛することは、私は最大の力を作成し続けるものです。

おすすめ

転載: www.cnblogs.com/biaochenxuying/p/11484350.html