QQ互联的注意事项

业务逻辑

最近试了一下用QQ登陆联系原有的账户体系,由于用了LeanCloud提供的后台服务,我只用关心QQ互联的部分。

首先,它的业务逻辑是:你先设置一个按钮,要跳转到QQ登陆页面,登陆完成后跳转到回调页面。回调页面即可以是用户主页也可以是一个中间页面用于跳转。

在PC上,曾经常见的模式是弹出QQ登陆小窗,登陆后原页面收到登陆成功的回调更新登陆状态。

但以上的方式如果在移动端使用,由于没有回调地址,唤起QQ登陆后无法跳转到用户界面,并且原页面也不会收到回调。

所以现在有一个模式,就是点击QQ登陆后原页面直接跳转到QQ登陆页面,登陆成功后回调地址收到accessToken与openId,之后再处理业务逻辑。

OAuth 2.0

A->B->C->D->E
先获取Code,然后再获得Token,重定向URI必须保持一致

现在你可以用他们的API来实现以上功能,比如QQ互联提供了QQ登陆地址的格式,通过Authorization获取AccessToken,通过AccessToken获取openId的接口,以及getUserInfo等api的接口。但我尝试后发现这些api没有设置跨域头,如果直接在前端获取会被浏览器拦截,因此我选择用他们的PHP SDK。

PHP SDK

SDK使用虽然很方便,但还是没有设置跨域头,你需要在页面输出前设置Access-Allow-Control-Origin。还没完,PHP SDK使用了session,不能像官方的获取用户信息的api一样直接请求,你还需要设置Access-Alllow-Control-Credentials,在前端请求时如果用AXIOS,也要加上withCredentials的配置。

由于我习惯把不涉及安全业务逻辑放到前端,所以我在callback.php里将AccessToken与OpenId传给前端的Login组件,由前端请求后判断是否是新用户等等。(也由于使用了LeanCloud,php并不能直接查数据库,所以干脆放在前端)

JS SDK

QQ互联我花了不少时间,主要是理解它的业务逻辑,还有跨域的问题。我开始用的是JS SDK,但似乎它已年久失修(12年更新过),而且它要求用script标签引入,我在前端还要检查SDK对象是否已加载完成,让我的代码很混乱,加上还是要后端协助解决跨域,所以还是不用了。

PHP&CURL 小插曲

其实还有一个小插曲,PHP SDK需要curl,但我安装的php 7.3 似乎并编译不上,而且php7.2-curl都是有的,但php7.3-curl还没有。。。只好换成7.2。

command not found:向Mac添加环境变量

出现command not found一般由于软件没有安装好或者环境变量没有配置好,前一种多半会看到一串提示,后者不一定,可能需要手动配置一下。

编辑~/.bash_profile配置文件

在终端中输入vim ~/.bash_profilei进入insert模式,编辑好文件后按esc,输入:wq即可。

添加环境变量的标准格式:

export PATH="$PATH:/usr/local/Cellar/node/10.3.0/bin"

有的配置只对当前终端起作用,有的对所有用户起作用,如果想了解更多环境变量配置的的知识,可以参考github上的一篇比较详细的文章https://github.com/nodejh/nodejh.github.io/issues/34

Mac配置PHP运行环境

Mac自带了PHP与Apache,只需要简单配置就可以运行,不过MySQL需要自己安装。

Brew

用Brew来管理Mac上的软件,你只需要brew install xxx就可以使用这个与apt/yum相似的包管理服务。如果不知道怎么安装Brew,访问https://brew.sh/

#一键安装Brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Apache

Apache的配置文件位于/private/etc/apache2,你可以更改网站根目录(DocumentRoot "/Library/WebServer/Documents")以及更多的配置。

PHP

Mac自带PHP,我升级PHP(brew update php)时终端显示了以下内容,配置PHP只要按他说的去做就行:

To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php7_module /usr/local/opt/php/lib/httpd/modules/libphp7.so

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

Finally, check DirectoryIndex includes index.php
    DirectoryIndex index.php index.html

The php.ini and php-fpm.ini file can be found in:
    /usr/local/etc/php/7.3/

To have launchd start php now and restart at login:
  brew services start php
Or, if you don't want/need a background service you can just run:
  php-fpm

改完配置文件如果还不能正常运行php文件,试试重启Apache(sudo apachectl restart)。

MySQL

用Brew安装MySQL(brew install mysql),像PHP的启动一样,你也可以把MySQL作为服务运行(brew service start mysql)。安装完成后root用户没有默认密码。

Mac下写8086汇编

前期准备

我们课上讲的是8086下的16位汇编,如此远古的操作系统导致我在配置环境时遇到了很多问题。起初打算在win7虚拟机下用masm和汇编ide写汇编,但编译不成功,因为masm新版已经不是16位了。据查,masm5.0版本支持16位汇编,但又发现了DOSBox,与其在win7虚拟机下模拟DOS,不如直接在Mac中运行DOS环境。

DOSBox下载:https://www.dosbox.com/

Step1、下载DosBox和masm5.0,将masm5.0放到用户文件夹内(避免权限不够)


Step2、在DOSBox中键入"mount c ~/masm5.0",将masm5.0文件夹挂载为C盘。~代表当前用户目录,即/Users/xxx

Step3、在Mac中将写好的汇编源文件xx.asm放到masm5.0目录下,依次键入"masm xx.asm;"与"link xx.obj;",就可以直接运行程序了 masm负责将汇编源文件翻译成obj文件,link将obj文件链接成exe

图1

#用批处理来完成Step3

Mac下使用文本编辑工具(vscode也有masm插件支持汇编高亮)在masm5.0目录下新建一个xx.bat,把命令按行写进去就好了,如:

masm xx.asm;
link xx.obj;
xx.exe

编写第一个汇编程序

https://www.guohere.com/659.html

如果你已经了解过指令系统寄存器,这些例子将向你介绍汇编源文件的基本结构:

data segment;定义数据段
  x db 'A'; define byte定义x为一个值为A的ASCII码的字节型变量
  y dw 30h; define word定义y为一个值为30h(48)的字型变量
  z dd 40h; define double word定义z为一个值为40h(64)的双字型变量
  a dw ?;定义一个变量
data ends;段结束的标记

stack1 segment para stack;不需要堆栈段可以不要这部分
  db 10h dup(0)
stack1 ends

code segment
assume cs:code,ds:data; assume伪指令用于确定段与段寄存器的关系,assume不会翻译成机器指令,但会存在于exe的文件头中,这会方便DOS重新分配内存时改变对应地址指针寄存器的值
start:mov ax,data;汇编后段名变成立即数,立即数不能直接赋值给段寄存器
  mov ds,ax;段寄存器将指向data数据段
  mov dl,x;显示字符前将字符移动到dl
  mov ah,02h;调用字符显示
  int 21h
  mov ah,4ch;4ch对应返回控制台子程序
  int 21h;根据ah确定子程序,自动跳转到子程序入口地址
 code ends
end start

#大小写转换

data segment;数据段
  errs db 'error!$'
data ends

stack1 segment para stack;堆栈段
  
stack1 ends

code segment;代码段
assume cs:code,ds:data
start:mov ax,data;程序起点
      mov ds,ax
input:mov ah,08h;控制台输入到al
      int 21h
      cmp al,'0';是否=0
      jz zero
      cmp al,'A';是否>=A,大于等于则cf=0,对应jnc
      jc err;<A且!=0的情况
      ;下面的情况>=A
      cmp al,5bh;是否<=Z,和Z的后一个字符比较,小于则cf=1,对应jc
      jc plus
      ;下面的情况>Z
      cmp al,'a'
      jc err
      cmp al,7bh
      jc minus
      jnc err
zero: mov dl,'0';移动到dl供显示
      mov ah,02h;字符显示
      int 21h
      mov ah,4ch;返回控制台
      int 21h
plus: add al,20h
      mov dl,al
      jmp show
minus: sub al,20h
       mov dl,al
       jmp show
show: mov ah,02h;字符显示
      int 21h
      loop input
err:  mov dx,offset errs;将errs首地址传送给dx
      mov ah,09h;召唤字符串
      int 21h;芝麻开门
      loop input

code ends;代码段结束
 end start

Mac下简单配置MariaDB

数据库应用技术课需要在设备上安装数据库做一些实验,这里整理一下最简单的配置方法。

Step1.安装MariaDB/MySQL。我已经下载了XAMPP,也可以直接从官网下载或用Homebrew下载,然后打开终端(使用XAMPP则在XAMPP里打开终端)。

Step2.在终端内输入"mysql_secure_installation"命令,按照终端提示修改密码(默认密码一般为空)。如果用XAMPP则应该允许root用户远程登陆,其他选Y。

mysql_secure_installation

Step3.终端内输入"mysql -u root -p"命令,按提示输入密码,成功连接数据库。在数据库中输入查询"use mysql; grant all privileges on *.* to root@'%' identified by 'password';"(授权任意主机登陆的root账户拥有所有权限)后键入"\q"命令退出(还可以用status命令看看数据库状态)。

mysql -u root -p
use mysql;
grant all privileges on *.* to root@'%' identified by 'password';
status

Step4.下载SequelPro软件,使用GUI数据库管理软件方便操作,XAMPP可以查看其IP,安装到主机上地址填127.0.0.1或localhost。然后可以使用SequelPro可视化地对数据库进行实验。